定食屋おろポン

おろしポン酢と青ネギはかけ放題です

基礎から真面目に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式の範囲分岐, 正規表現分岐かわいい