3

ruby Kernel doc を調べていたところ、次のメソッドが見つかりました。

a = 2
local_variables # => [:a, :_]

a ではなく :a を返すのはなぜですか? 「:」は記号用に予約されていると思いましたが、記号 :a は変数 a も割り当てられた値 2 も指していません。

さらに、このメソッドを介して実際の変数にアクセスするにはどうすればよいでしょうか? b=local_variables.first のように (2 になりますが、:a です)。

この動作の背後にある理由は何ですか?

ありがとう/

4

3 に答える 3

8

a ではなく :a を返すのはなぜですか? 「:」は記号用に予約されていると思いました

これは予想される動作です。ドキュメントによると:

現在のローカル変数の名前を返します。

そうです、これはシンボルの配列を返すだけです。


さらに、このメソッドを介して実際の変数にアクセスするにはどうすればよいでしょうか?

Jonathan Camenisch が指摘したように、Ruby 2.1 ではBinding#local_variable_get以下が導入されました。

a = 2
binding.local_variable_get(:a)
#=> 2

古い Ruby の場合、以下を使用できますeval

a = 2
eval(:a.to_s)
#=> 2

この動作の背後にある理由は何ですか?

Ruby では、シンボルは参照に使用されます。

"foo".methods
#=> [:<=>, :==, :===, :eql?, :hash, :casecmp, ...]

Module.constants
#=> [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, ...]
于 2013-09-04T15:53:43.330 に答える
3

a ではなく :a を返すのはなぜですか?

は変数であり、Ruby では変数はオブジェクトではないaため、を返すことはできません。aメソッドは、オブジェクトを受け取り、返し、操作することしかできません。

于 2013-09-05T00:04:14.040 に答える