4

Rubyでスコーピングがどのように機能するかについて少し混乱しています。次のコードがxの値を出力できないようにするRubyスコープルールはどれですか?

#!/usr/bin/ruby

x = 5
def test
    puts "x = #{x}"
end

test    # => undefined local variable or method `x' for main:Object

同等のPythonスクリプトは、xの値を出力します。

#!/usr/bin/python

x = 5
def test():
    print "x = %s" % x

test()  # => x = 5
4

2 に答える 2

5

これがいわゆる「スコープゲート」です。ruby には、メソッド、クラス、またはモジュールの定義の 3 つのゲートがあります。その定義内では、外側のスコープからのローカルは表示されないことを意味します。

これは、スコープが変更されると、現在のバインディングのセットが新しいバインディングのセットに置き換えられ、簡単にアクセスできないためです。

詳細については、「Ruby のメタプログラミング: Ruby のプロのようにプログラムする」を参照してください。

于 2012-07-23T21:26:12.307 に答える
3

Ruby のスコープとスコープ ゲーティングの詳細については、 「Ruby クラス、インクルード、およびスコープ」を参照してください。

テスト関数を可視化する方法はいくつかあります。1 つは、変数をインスタンス変数にすることです。

#!/usr/bin/ruby

@x = 5
def test
    puts "x = #{@x}"
end

もう 1 つは、ラムダでクロージャを使用することです。

#!/usr/bin/ruby

x = 5
test = lambda do
    puts "x = #{x}"
end

test.call

または Proc.new()

#!/usr/bin/ruby

x = 5
test = Proc.new do
    puts "x = #{x}"
end

test.call

lambda と Proc.new の違いについては、「lambda を使用する場合、Proc.new を使用する場合」を参照してください。

于 2012-07-23T21:35:31.530 に答える