亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ruby -- 全局與局部問題
黃舟
黃舟 2017-04-22 08:59:49
0
6
862
n = 5
def num
  puts n
end

為什麼是錯的的?
我知道全局和局部基本原理。
局部變量在函數(shù)裏隻能使用,在外部是不存在。

但是在python或js裏使用這樣方式可以執(zhí)行的!
還是隻有ruby要在函數(shù)使用變量需要重新宣告。

請問各位可以解釋嗎?
謝謝

黃舟
黃舟

人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!

全部回覆(6)
黃舟

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

我也是初學(xué)者,看看其它高手怎麼說。

迷茫

但是在python或js裡使用這樣方式可以執(zhí)行的!

Python 中是唯讀


以下是猜想為什麼 Ruby 要這麼搞?

Ruby 中 def 生成的方法只能訪問全局變量。
define_method 生成的方法 和 -> (param) {}lambda { |param| } 產(chǎn)生的 proc 帶閉包,可以存取外層變數(shù)。

我猜想是因?yàn)?Ruby 認(rèn)為最常用的情況是你不需要訪問外層變量,所以 def 不給你訪問了,這樣的好處:

  • 不會像 js 一樣無意中搞亂外層變數(shù)。 JavaScript 為了避免這一點(diǎn),都要在 function 頭部把體內(nèi)用到的變數(shù)都 undefined 一下,很囉嗦。
  • 不用建立閉包,節(jié)省開銷。

至於 lambda 帶閉包那很正常,都 lambda 了不帶閉包說的過去嗎?

至於 define_method,猜想是因?yàn)?/p>

  • define_method 因?yàn)槭撬^元編程,有更大機(jī)率用外層變量,(本來用元編程就是偷懶少打字,要是不能用外層變量,還要作為參數(shù)傳入,那累死了。)所以就帶閉包。
  • method 定義不能帶閉包有時候會不方便,但是通常也不需要,所以就讓長一點(diǎn)的 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變成函數(shù)就可以了

def n
  5
end

def num
  p n
end

num
巴扎黑

這問題火啊。剛?cè)ヌ?,回來就幾人回答了?

你的程式碼中的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 風(fēng)格中 ,$是多麼扎眼啊。 ruby老闆知道全域變數(shù)不可缺,但也怕濫用,因此玩了一個小把戲;)。涉及到的是ruby variables scope 的知識,ruby的優(yōu)點(diǎn)複雜也與眾不同。

@andrewzhyl 說的不錯,按讚。

小葫蘆

做個筆記:def與def_method的區(qū)別:def是用來定義方法的關(guān)鍵字;def_method是一個方法,它的作用是產(chǎn)生一個新方法,def中的代碼跟上下文完全隔離的(只認(rèn)識帶@跟美刀的變數(shù));而define_method就顯得更open一點(diǎn),樂意認(rèn)識不帶任何修飾的夥伴。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板