7

私は Ruby と Python を同時に学んでいますが、気づいたことの 1 つは、これら 2 つの言語ではスコープの扱いが異なるように見えることです。これが私が意味することの例です:

# Python
a = 5
def myfunc():
  print a

myfunc() # => Successfully prints 5

# Ruby
a = 5
def myfunc
  puts a
end

myfunc # => Throws a "NameError: undefined local variable or method `a' for main:Object"

def ブロックは、Python では直接のスコープ外で宣言された変数にアクセスできますが、Ruby ではアクセスできないようです。私の理解が正しいかどうか誰かが確認できますか? もしそうなら、これらのスコープの考え方のいずれかがプログラミングでより一般的かどうか?

4

3 に答える 3

5

免責事項:私はPythonの専門家ではありません

Pythonでは、モジュールで定義された変数は、デフォルトではモジュール変数であり、そのモジュールに対してグローバルです。Rubyでは、小文字の変数を定義すると、それは常にローカル変数になります。ローカル変数には、それらを定義したブロックと、変数をラップするそのブロックで定義されたprocs/lambdaでのみアクセスできます。

Rubyでは、変数がスコープをまたぐには、次のいずれかである必要があります。

  • 定数(ALL_CAPS):適切なスコープが前に付いている場合は常にアクセス可能
  • クラス変数(@@double_at):定義しているクラスとサブクラスから常にアクセスできますが、外部からはアクセスできません
  • インスタンス変数(@single_at):そのオブジェクト内からのみアクセス可能であり、getterメソッド/を使用して外部からアクセス可能get_instance_variableです。
  • グローバル($starts_with_dollar):悪い考えです。すべてのスコープにまたがり、スコーピングは必要ありません。使ってはいけません!
于 2013-02-23T16:47:18.377 に答える
1

モジュールを使用disして、Pythonが何をしているかを確認できます。

import dis

a = 5
def myfunc():
  print a

結果:

>>> dis.dis(myfunc)
 15           0 LOAD_GLOBAL              0 (a)
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

aつまり、それがグローバルスコープにあることがわかります。

于 2013-02-23T18:20:35.673 に答える
1

Ruby では、呼び出しているメソッドの外部で定義された変数にアクセスする場合は、それをグローバルとして定義する必要があります。Ruby はローカル スコープで定義された変数との一致を試み、見つからない場合は例外をスローします。

$符号付きのグローバル変数を定義できます。

$a = 5
def myfunc
  puts $a
end

myfunc

ただし、一般的な規則として、グローバル変数を定義することはお勧めできません。そうしないと、グローバル名前空間が汚染される危険があります。

于 2013-02-23T16:35:30.027 に答える