n = 5 def num puts n end
為什麼是錯的的? 我知道全局和局部基本原理。 局部變量在函數裏隻能使用,在外部是不存在。
但是在python或js裏使用這樣方式可以執行的! 還是隻有ruby要在函數使用變量需要重新宣告。
請問各位可以解釋嗎? 謝謝
人生最曼妙的风景,竟是内心的淡定与从容!
def 是開啟了一個新的作用域
n = 5 local_variables # => [:n, :_] def num local_variables # => [] end
如果你要訪問 n,需要用扁平化作用域
define_method :num do puts n end
@n = 5 def num puts @n end
我也是初學者,看看其它高手怎麼說。
但是在python或js裡使用這樣方式可以執行的!
Python 中是唯讀
以下是猜想為什麼 Ruby 要這麼搞?
Ruby 中 def 生成的方法只能访问全局变量。define_method 生成的方法 和 -> (param) {} 或 lambda { |param| } 產生的 proc 帶閉包,可以存取外層變數。
def
define_method
-> (param) {}
lambda { |param| }
我猜想是因為 Ruby 認為最常用的情況是你不需要訪問外層變量,所以 def 不給你訪問了,這樣的好處:
function
至於 lambda 帶閉包那很正常,都 lambda 了不帶閉包說的過去嗎?
至於 define_method,猜想是因為
define_method (symbol) { |param| }
define_method(symbol, method)
method
@Andrew_375683 說的是正確的. 主要是作用域的問題 不過這裡還有個簡單的方法解決將n變成函數就可以了
def n 5 end def num p n end num
這問題火啊。剛去趟,回來就幾人回答了。
你的程式碼中的n,你以為是全域變量,可惜不是
irb(main):006:0> x =10 => 10 irb(main):009:0> defined? x => "local-variable"
需要修改就是加個$作為前綴即可:
irb(main):010:0> $x = 1 => 1 irb(main):011:0> defined? $x => "global-variable"
在美好的ruby 風格中 ,$是多麼扎眼啊。 ruby老闆知道全域變數不可缺,但也怕濫用,因此玩了一個小把戲;)。涉及到的是ruby variables scope 的知識,ruby的優點複雜也與眾不同。
@andrewzhyl 說的不錯,按讚。
做個筆記:def與def_method的區別:def是用來定義方法的關鍵字;def_method是一個方法,它的作用是產生一個新方法,def中的代碼跟上下文完全隔離的(只認識帶@跟美刀的變數);而define_method就顯得更open一點,樂意認識不帶任何修飾的夥伴。
def 是開啟了一個新的作用域
如果你要訪問 n,需要用扁平化作用域
我也是初學者,看看其它高手怎麼說。
Python 中是唯讀
以下是猜想為什麼 Ruby 要這麼搞?
Ruby 中
def
生成的方法只能访问全局变量。define_method
生成的方法 和-> (param) {}
或lambda { |param| }
產生的 proc 帶閉包,可以存取外層變數。我猜想是因為 Ruby 認為最常用的情況是你不需要訪問外層變量,所以
def
不給你訪問了,這樣的好處:function
頭部把體內用到的變數都 undefined 一下,很囉嗦。至於 lambda 帶閉包那很正常,都 lambda 了不帶閉包說的過去嗎?
至於
define_method
,猜想是因為define_method
因為是所謂元編程,有更大機率用外層變量,(本來用元編程就是偷懶少打字,要是不能用外層變量,還要作為參數傳入,那累死了。)所以就帶閉包。define_method
帶閉包囉。define_method
除了define_method (symbol) { |param| }
,还可以写成define_method(symbol, method)
,其中method
比较常用的就是传入一个 lambda,既然传入 lambda,如果本身define_method
除了define_method (symbol) { |param| }
,還可以寫成define_method(symbol, method)
,其中method
比較常用的是傳入一個lambda,既然傳入lambda,如果本身@Andrew_375683 說的是正確的.
主要是作用域的問題
不過這裡還有個簡單的方法解決將n變成函數就可以了
這問題火啊。剛去趟,回來就幾人回答了。
你的程式碼中的n,你以為是全域變量,可惜不是
需要修改就是加個$作為前綴即可:
在美好的ruby 風格中 ,$是多麼扎眼啊。 ruby老闆知道全域變數不可缺,但也怕濫用,因此玩了一個小把戲;)。涉及到的是ruby variables scope 的知識,ruby的優點複雜也與眾不同。
@andrewzhyl 說的不錯,按讚。
做個筆記:def與def_method的區別:def是用來定義方法的關鍵字;def_method是一個方法,它的作用是產生一個新方法,def中的代碼跟上下文完全隔離的(只認識帶@跟美刀的變數);而define_method就顯得更open一點,樂意認識不帶任何修飾的夥伴。