Ruby基礎復習(1) 基礎文法

去年末から今年のはじめにかけてRuby Silver/Goldの再受験無料キャンペーンってのやってて、おーこりゃちょうどいいわーと思って取りあえず受けたら見事に落ちたんですけど、その後再受験申し込み期間あるの忘れてて棒に振るとかよくわからんことやりました。そのままなんとなーくやる気なくなってたけど、さすがにSilverクラスの知識はきちんと押さえるべきだろってことで、しばらく手元の『パーフェクトRuby』使って自分用チートシートっぽくまとめてみます。超基礎なので退屈な記事が続く予定。

今回は文法面で自分がつまずいたポイントまとめる。

変数のスコープ

ローカル変数、グローバル変数、インスタンス変数、グローバル変数がまず基本にある。それぞれ文字通りではあり、ローカル変数は最も局所的なスコープ、グローバルはどこからでも参照可能(あまり使わない?)、インスタンス変数は個々のインスタンスに属する変数、クラス変数はクラス間で共有される変数。

 1def display_local
 2  puts hoge
 3end
 4
 5def display_global
 6  puts $hoge
 7end
 8
 9$hoge = "Hello, world!"
10
11display_local # => NameError: undefined local variable or method `hoge' for main:Object
12display_global # => "Hello, world!"
 1class Hoge
 2  @@class_var = "Hello, world from class!"
 3  
 4  def display_class_var
 5    puts @@class_var
 6  end
 7
 8  attr_accessor :ins_var
 9end
10
11i = Hoge.new
12j = Hoge.new
13
14i.display_class_var # => "Hello, world from class!"
15j.display_class_var # => "Hello, world from class!"
16i.ins_var = 1
17j.ins_var = 2
18i.ins_var # => 1

しかし改めてattr_accessorというのは便利ですね。

問題はローカル変数とブロック、メソッドとの関係で、わりと理解できてなかった。やりがちだけど、メソッドの中からメソッド外のローカル変数は参照できない。一方でブロックの中からブロック外のローカル変数は**参照できる。**一方でブロック内のみで宣言されている変数は、ブロックローカル変数扱いになり外から参照できない。

1hoge = "hoge"
2
3def hello_hoge
4  puts hoge
5end
6
7hello_hoge # => NameError: undefined local variable or method `hoge' for main:Object
1i = 1
2
33.times do |j|
4  i = i + j
5  block_local = 'in block'
6end
7
8puts i # => 4
9puts block_local # => NameError

Rangeクラス

Ruby Silver受けるまで、恥ずかしながら1..10みたいのがクラスだということを知りませんでした。Rangeクラスってのがあるのね。。

 1range1 = 1..4
 2range2 = 1...4
 3range1.class # => Range
 4
 5range1.each do |i|
 6  puts i
 7end # => 1,2,3,4
 8
 9range1.include?(4) # => true
10range2.include?(4) # => false

三項演算子

苦手。ついでに後置if/unlessもよく使うので頭に置いとく。

10.zero? ? '0です' : '0じゃないです' # => '0です'
2puts '0です' if 0.zero? # => '0です'

rescue

rescue節を複数書いた場合、最初に該当したrescue節で捕捉され、その後のrescue節は捨象される。

1begin
2  raise 'StandardError'
3rescue LoadError => e
4  puts 'これはloaderrorです'
5rescue StandardError => e
6  puts 'これはstandarderrorです'
7rescue Exception => e
8  puts 'これはなにかエラーです'
9end # => 'これはstandarderrorです'

今後のtodo

まーぶっっちゃけ全部だな。。。。