takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

たのしいRuby で Ruby の学習 第1部

たのしい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> 

終了するときは、exitCtrl-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
$