基礎から真面目にRubyを勉強する-変数と式編-
変数のスコープ
ローカル変数のスコープは結構言語ごとに違うよね。国によってパーソナルスペースが違うみたいな感じですかね。
foo = "Foo" loop do p defined?(foo) # => "local-variable" bar = "Bar" break; end 1.times do |foobar| p defined?(foo) # => "local-variable" baz = "Baz" end p defined?(foo) # => "local-variable" p defined?(bar) # => nil p defined?(baz) # => nil p defined?(foobar) # => nil p defined?(true) # => "true" p defined?(false) # => "false"
defined?演算子は、定義されているときは種別を文字列で返し、定義されていないときは偽(nil)を返すみたいね。
(文字列の)"true", "false"が返るのは、true, falseを評価した時だけのようだ。
ブロック内から外で宣言された変数を参照することはできるが、外からはブロック内で宣言された変数を参照することはできない。
当然、ブロック内から外で宣言された変数に変更,再代入もできる。
foo = "Foo" loop do foo << "Bar" break end puts foo # => "FooBar"
一方で、if式, case式, while式などではスコープそのまま。あたらしいスコープを作りません。
foo = "Foo" if true then foobar = foo + "Bar" end puts foobar # => "FooBar" case when true then foobarbaz = foobar + "Baz" end puts foobarbaz # => "FooBarBaz" while foobarbaz do foobarbazqux = foobarbaz + "Qux" foobarbaz = false end puts foobarbazqux # => "FooBarBazQux"
ていうか、case式で変数宣言できちゃうんだよね。面白いね。C言語のswitch文中で普通に変数宣言したら怒られちゃうもんね。
で、これらと一緒に考えちゃダメなのがdef式とclass式で、これらは完全にローカル変数のスコープが分離している、と。
...そういうふうに理解してるんだけど合ってるのかな。怖いな。
foo = "Foo" def sample_method p defined?(foo) # => nil bar = "Bar" end sample_method() p defined?(bar) # => nil class SampleClass def instance_method p defined?(foo) # => nil p defined?(bar) # => nil baz = "Baz" end end sample_obj = SampleClass.new sample_obj.instance_method() p defined? baz # => nil
ローカル変数はこのくらいですね。結局amazon:初めてのRubyにはあまり詳しく書いてなくて、適当に自分で調べました。
グローバル変数とか言うのは慣れてきたら使うようにします。グローバル変数って麻雀で言う”鳴き”に近い気がする。初心者が安易に使いがちだが実際には使いどころが難しい。鳴いてばかりだと上達しない。
制御式
case式の範囲分岐, 正規表現分岐かわいい