ラズベリーパイを使ったプログラミングの入門的な記事です。
Rubyを使ったプロラミングにおける、4つの基本要素について書きます。
Rubyの4つの基本要素
プログラム言語の4つの基本要素については、以下の記事に書きました。
この記事にも書きましたが、プログラム言語の基本要素として、この記事で取り上げるものはRubyについての次の4つです。
- 変数
- 表示
- 繰り返し
- 条件分岐
プログラミングに使用する要素はもちろん他にもたくさんありますが、新しいプログラム言語を勉強するときに、最初に調べる基本要素のうちの4つではないかと思います。
では、順に見ていきましょう。
Rubyにおける”変数”の書き方
変数には、スコープという概念があります。
書く場所は書き方によって、その変数を参照できるかどうかが変わってくることがあるのです。
スコープによって、同じ変数名でも中身の値が違って見えたりします。
プログラミングの学習を始めたばかりという方には、不便に感じるかもしれませんが、実はこれがプログラミングにおいて重要な役割を果たします。
ここでは、そのスコープが異なる、ローカル変数とグローバル変数の2つの書き方を覚えておくことにします。
これ以外に、クラスを使ったプログラムを書く段階になると、インスタンス変数(@で始まる変数)やクラス変数(@@で始まる変数)を覚えることになりますが、これは別の機会に説明します。
スポンサーリンクローカル変数
ローカル変数は以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 | a=1 puts a b=a+1 puts b stm="abc" puts stm stn=stm+"def" puts stn |
実際に実行して確認できるように、変数の内容を表示するputsというコマンド(メソッド)を入れています。
1行目は変数aに整数1を代入しています。
4行目は変数bに、変数aの値と整数1とを加算した結果を代入。
7行目は変数stmに文字列abcを代入。
10行目は変数stnに変数stmの値と文字列defとを加算した値を代入・・・、Rubyでは文字列の”加算”は文字列を順につなげることを意味します。
実行した結果は以下です。
1 2 3 4 5 | $ ruby sample1.rb 1 2 abc abcdef |
ここで1つ注意。変数名の文字数は、例で上げたように1文字でも複数個の文字でも構いませんが、先頭は小文字で始める必要があります。
もし大文字で始めると、それは変数ではなく定数であると宣言することになります。これはプログラムを通して値が変わらないものを記述するときに使います。
Rubyでは定数として宣言したものでも、実はあとでその値は変更できてしまうのですが、warningが出力されてしまいます。
グローバル変数
グローバル変数を使用するときは、変数名の頭に”$”マークを付けます。
1 2 3 4 5 6 7 8 | $val_a=1 def func_1 $val_a=2 end func_1 puts $val_a |
このsample2.rbは、val_aという変数をグローバル変数として使用しています。
1行目に整数1を代入。
3行目は、func_1というメソッドを定義しています。func_1と書いて呼び出すと、4行目を実行します。グローバル変数val_aに整数2を代入します。
7行目で早速func_1を呼び出し、8行目val_aの値を表示させています。
結果は期待通り、
1 2 | $ ruby sample2.rb 2 |
2と表示されます。
ところが、val_aをローカル変数で宣言すると、結果が変わってきます。
1 2 3 4 5 6 7 8 | val_a=1 def func_1 val_a=2 end func_1 puts val_a |
sample2.rbとの違いは$val_aがval_aに変わったことだけですが、これを実行すると、
1 2 | $ ruby sample3.rb 1 |
値が1と出力されます。
これは、1行目のval_aも4行目のval_aもローカル変数であるため、4行目のval_aは3から5行目の範囲だけで有効な変数、1行目のval_aは(このプログラムの場合)それ以外の場所で有効な変数となるためです。
4行目のval_aは5行目のendでもって、その変数の役割を終えてしまいます。8行目のputsは、1行目で書いたval_aの値を表示しているのです。
このグローバル変数、実は使用にあたっては注意が必要です。このようにエディタの画面1枚に治まる位の規模なら問題にならないことが多いですが、プログラ厶のコード行数の規模が大きくなってくると、プログラム全体で共通に使えるという点が、かえってデメリットになってくることがあります。
ここにきて、さきほど述べたスコープという概念が重要になってくるのです。
まったく使わないわけでもないのですが、適切な使い方をする必要があります。
Rubyにおける”表示”の書き方
Rubyにおいて、変数の値や文字列を画面に表示するコマンド(Rubyでは”メソッド”)は、puts, print, printf, pなどいくつかあります。
putsを使用した例は、ここまでに書いたサンプルプログラムの通りですが、これらはprint, printf, pなどでも書けます。
1 2 3 4 5 6 | val_a=1 puts val_a print val_a,"\n" printf("%1d\n", val_a) p val_a |
sample4.rb では、val_aという変数の値を表示する方法をいくつか並べました。いずれも実行すると、1を表示するはずです。
いろいろ試してみていただくとわかりますが、pメソッドは値と共にその型情報(数値型とか文字列型とか)も表示するため、変数によっては表示が他と異なってくることがあります。
表示するときには、何の変数の値かを合わせて表示したいこともあるでしょう。その場合は以下のように書きます。
1 2 3 4 5 6 | val_a=1 puts "val_a=#{val_a}" print "val_a=",val_a,"\n" printf("val_a=%1d\n", val_a) p "val_a=#{val_a}" |
putsやpでは、表示する文字列の末尾に自動的に改行が入るので、sample5.rbのように、表示する文字列の中に、#{変数名}という書き方で埋めこんでしまいます。printやprintfを使うと、同じくsample5.rbのように書けます。
Rubyにおける”繰り返し”の書き方
Rubyには、”繰り返し”を記述する方法がいくつかあります。
単純に同じことを繰り返すときには、timesが便利です。
1 2 3 | 10.times do puts "aaa" end |
これは、puts “aaa” を10回繰り返します。
構造的には10という数字がオブジェクトであり、timesはそのオブジェクトのメソッドである、という説明になるのですが、詳細はここでは省略します。
上記は、以下のようにも書けます。
1 2 3 | 10.times { puts "aaa" } |
このように、doやendを中括弧で囲んでも、ここでは同じ結果になります。
ループするときに何回目のループかを合わせて表示したいことがあると思いますが、それは
1 2 3 | 10.times do |i| puts "#{i}: aaa" end |
というように、|i|をdoの直後にいれておけば、ローカル変数iにそのループのインデックスが入ります。実行してみてください。これは中括弧による書き方でも使えます。
他に、upto,downto,while,forなどを使ったループの記述方法があります。
Rubyにおける”条件分岐”の書き方
最後は条件分岐です。
条件分岐は、if文、unless文、case文などがあります。
if文の例は以下です。
1 2 3 4 5 6 7 8 9 | val_a=1 if val_a == 1 puts "aaa" elsif val_a == 2 puts "bbb" else puts "ccc" end |
お馴染みのif-elsif-else-endの条件分岐です。elsifやelseは必要がなければ省略できます。