たのしいRuby の力を借りて Ruby を学習していく
実際の本は、Kindle版を買いました。
この連載?は、ツッコミ等々歓迎です。かなり端折る場合も有りますが、ご了承下さい。(省略部分を知りたい方は、購入して下さい。)
https://www.amazon.co.jp/dp/4797386290www.amazon.co.jp
環境
$ ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
第1章 はじめてのRuby
さくっと流していければいいかな。
Rubyの実行方法
ruby コマンドを使う
$ ruby <program name>
例
## 書いたコードの確認 $ cat helloruby.rb print("Hello, Ruby.\n") ## 実行 $ ruby helloruby.rb Hello, Ruby.
irb を使う
irb
コマンドは、ruby
コマンドと同様にコンソールから実行する。ただし、プログラムを書いたファイルは指定しない。
irb
実行例
$ irb irb(main):001:0>
ここに、先ほど作ったプログラムの内容をそのまま入力し、[Enter]キーを押すとその場で実行される。
irb(main):001:0> print("Hello, Ruby.\n") Hello, Ruby. => nil irb(main):002:0>
終了するときは、exit
か Ctrl-d (CTRL + d)
です。
改行文字と[\
]
改行文字 \n
エスケープ文字 \
つまり、\
はエスケープ文字と呼ばれ、\n
や \
そのものなど、特殊文字の特殊効果をエスケープ(回避)できるわけです。
[‘’] と [“”]
シングルクォート [‘’]
ダブルクォート [“”]
これ、動きが違います。
シングルクォートで囲まれると、囲まれた中身?にある特殊な文字列や変数の展開などは行われません。
$ irb # ダブルクォートで囲まれているため、\n が効力を発揮して、改行されている。 irb(main):001:0> print("hello, \nRuby") hello, Ruby=> nil # シングルクォートで囲まれているため、\n の効力が消え、\n そのものも文字列として扱われる。 irb(main):002:0> print('hello, \nRuby') hello, \nRuby=> nil irb(main):003:0>
メソッドの呼び出し
print メソッドを例に出す。
メソッドを呼び出すときは、()
を省略できる。
$ irb irb(main):001:0> print("hello\n") hello => nil irb(main):002:0> print "hello\n" hello => nil irb(main):003:0>
同じ結果になりました。
puts メソッド
よく使われると思います。
表示する文字列の最後で必ず改行します。
$ irb # 改行 \n を行末に書いてないけれど、改行されている。 irb(main):001:0> puts "hello, Ruby." hello, Ruby. => nil # 引数を2つ渡した場合、それぞれの文字列の最後で改行される。 irb(main):002:0> puts "hello, ", "Ruby." hello, Ruby. => nil irb(main):003:0>
p メソッド
オブジェクトの内容を表示するときに便利。
例えば、数値か文字列かを表示分けしてくれる。
$ irb # 文字列 irb(main):001:0> puts "100" 100 => nil # 数値 irb(main):002:0> puts 100 100 => nil # 文字列 irb(main):003:0> p "100" "100" => "100" # 数値 irb(main):004:0> p 100 100 => 100 irb(main):005:0>
p
の時は、文字列を出力するときに"“で囲われている事が確認できる。
原則として、p
メソッドはプログラムを書いている人の為のメソッド。
日本語の表示
日本語を表示したければ、文字列を""
で囲ってしまうだけでいい。
しかし、文字コードに気をつけよう。
Ruby では、# encoding: 文字コード
というコメントを1行目に記述することで文字コードを指定します。
このコメントのことを マジックコメント と言います。
環境に合わせて適切なものを選ぼう。
プラットフォーム | 文字コード(エンコーディング)名 |
---|---|
Windows | Shift_JIS (又は、(Windows-31J) |
Mac OS X (macOS) | UTF-8 |
Unix | UTF-8, EUC-JP など |
マジックコメントがない場合は、UTF-8と仮定される
。
実行時に出力用の文字コードを指定することも出来る。
$ ruby -E UTF-8 ファイル名 $ irb -E UTF-8
と指定することで出来る。
数値の表示と計算
表現方法
Ruby で整数オブジェクトを表現するのは簡単。
数字をそのまま書くだけ。
1
と書けば、1
の値の整数(Fixnum)オブジェクトになる。
100
と書けば、100
の値の整数オブジェクトに
3.1415
と書けば、浮動小数点(Float)オブジェクトになる
数値を表示するには
puts(10) puts 100
でOK
$ irb irb(main):001:0> puts(10) 10 => nil irb(main):002:0> puts 100 100 => nil irb(main):003:0>
四則演算やその他の演算
例
$ irb --simple-prompt >> 1 + 1 => 2 >> 2 - 3 => -1 >> 5 * 10 => 50 >> 100 / 5 => 20 # 99 を 5 で割った余り >> 99 % 5 => 4 >> 20 + 80 / 4 => 40 >> (20 + 80) / 4 => 25 # 3^3 のこと >> 3 ** 3 => 27 >>
変数
オブジェクトに名札をつけるようなイメージ
オブジェクトに名札をつけるには
変数名 = オブジェクト
例
alphabet = "abcdefg" num = 10 age = 22 name = 'TAKA'
実践例
直方体の表面積と体積を求めるプログラムを見てみよう
area_volume.rb
# encoding: UTF-8 x = 10 y = 20 z = 30 area = (x*y + y*z + z*x) * 2 volume = x * y * z print "表面積=", area, "\n" print "体積=", volume, "\n"
と表現できる。
もし、変数を使わなかった場合、値を変更するのが一苦労となる。
上記例の場合は、まだ良いが、量が増えるに連れミスの元となる。
また、変数名はある程度意味のわかる単語にしましょう。
例えば、上記x
,y
,z
が、foo
,bar
,baz
だったとすると、ぱっと見て意味のわかりづらいプログラムになります。
area = (foo*bar + bar*baz + baz*foo) * 2
意味がわかりませんね。
少しprintメソッドを見てみよう
print "表面積=", area, "\n"
これは、print
メソッドに"表面積="
, area
, "\n"
の3つの引数を順番に実行しています。
area
は、前段の area
変数の計算結果の展開がなされます。
前半の文字列と、後半の改行コードと合わせることで、結果が出力されます。
上記プログラムの出力
$ ruby area_volume.rb 表面積=2200 体積=6000
別の書き方もあります。
print "表面積=#{area}\n"
こうすると、1つの""
で全てを満たして出力してくれます。
更に、puts
メソッドを使うと、改行コードも必要なくなるので、
puts "表面積=#{area}"
でOKです。スッキリしましたね。
コメントを書く
コメントを表す記号は#
です。
#
以降の当該行の文字列は全てコメントになります。
また、以下の場合も、コメントとみなされます。
=begin ここ 何行でもOK =end
上記のような記載をすると、範囲が広い場合に有効だと思います。
しかし、個人的にはコメントを外して適用したいという時に使えないので、微妙だと考えていたりします。
制御構造
- 逐次処理
- 条件判断
- 繰り返し
- 例外処理
条件判断:if - then - end
いきなり例
if 条件 (then) 処理 end
then
は省略できる。
条件式の例
$ irb --simple-prompt >> p (1 == 1) true => true >> p (1 == 2) false => false >> p (1 < 2) true => true >> p (1 < 0) false => false >> p (1 <= 1) true => true >> p (1 <= 0) false => false >> p (2 > 1) true => true >> p (1 >= 1) true => true >> p ("a" == "a") true => true >> p ("a" == "b") false => false >> p ("a" != "b") true => true >> p ("a" != "a") false => false
基本的には、上記のような記号で判定できます。
!=
は not equal を表します。
サンプル
# coding: UTF-8 # ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] a = 20 if a >= 10 then puts "a:#{a} is bigger than 10" end if a <= 9 then puts "a:#{a} is smaller than 9" end #output #=> a:20 is bigger than 10
else
を使うと上記サンプルを少しシンプルに出来ます。
then
が省略できると言うことなので、それも盛り込んでみます。
サンプルプログラム
big_small_else.rb
# coding: UTF-8 # ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] a = 20 if a >= 10 puts "a:#{a} is bigger than equal 10" else puts "a:#{a} is smaller than 9" end #output #=> a:20 is bigger than equal 10
繰り返し
同じことを繰り返したいときに使う。
while 文
while 繰り返し続ける条件 do 繰り返したい処理 end
例:1から10までの数を順番に表示する
i = 1 while i <= 10 do puts i i = i + 1 end
times メソッド
繰り返しの回数が決まっている時、これを使うとシンプルになる。
繰り返す回数.times do 処理 end
例:hello と10回表示する
>> 10.times do ?> puts "hello" >> end hello hello hello hello hello hello hello hello hello hello => 10 >>
times
メソッドはイテレータと呼ばれるメソッドです。
イテレータ(iterator)はRubyの特徴的な機能らしいです。
繰り返す(iterate)もの(-or)という意味を持っています。
その名の通り、繰り返しを行うためのメソッドです。
times
以外にもRubyは数多くのイテレータを提供している。
以上で第1章は終わりです。ありがとうございました。
九九のプログラムを書いてみよう
multiplication_table.rb
# coding: UTF-8 # ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] i = 1 9.times do j = 1 9.times do x = i * j puts "#{i} x #{j} = #{x}" j = j + 1 end i = i + 1 end #=> output $ ruby multiplication_table.rb 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 1 x 4 = 4 1 x 5 = 5 1 x 6 = 6 1 x 7 = 7 1 x 8 = 8 1 x 9 = 9 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 3 x 5 = 15 3 x 6 = 18 3 x 7 = 21 3 x 8 = 24 3 x 9 = 27 4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 4 x 5 = 20 4 x 6 = 24 4 x 7 = 28 4 x 8 = 32 4 x 9 = 36 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 6 x 7 = 42 6 x 8 = 48 6 x 9 = 54 7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 7 x 8 = 56 7 x 9 = 63 8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 8 x 9 = 72 9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81 $