2017-11-11 103 views
0
def my_function(&block) 
    p block.call        #1 
    # lambda{return "inside the block"}.call #2 
end 

p my_function{return "implicit block"} 

爲什麼第1行給出LocalJumpError(它的意思是返回)?通過隱含塊給出本地跳轉錯誤

雖然根據我的第1行和第2行基本上是一樣的東西。block這裏的變量是proc對象,所以是lambda。
他們不應該也行爲相同。 2號線一旦註釋掉似乎並沒有給出錯誤

@Andre

def my_function(&block) 
    p block.call        #1 
    # lambda{return "inside the block"}.call #2 
end 

def abc 
p my_function{return "implicit block"} 
end 

abc 

不應該工作的呢?

+0

關於您的編輯:是的,它的工作原理。 –

+0

爲什麼你首先需要這個? – mudasobwa

回答

1

Lambda和Proc之間有很多不同之處,例如,您可以在此處看到post

其中之一是return在每種情況下的行爲。

當您在Proc中return時,它將從其被調用的方法返回。

而您在在Lambda它只返回到lambda代碼之外。

LocalJumpError的原因很簡單,因爲您可能從您的ruby控制檯調用return,並且沒有封閉的方法返回。所以如果你用一種方法來包圍你的代碼並且調用它,那麼它就會工作。

def test 
    def my_function(&block) 
    p block.call 
    end 

    p my_function{ return "implicit block" } 
end 

test 

=> "implicit block" 
+0

你能再看看編輯過的問題嗎?謝謝 –

+0

是的,我現在就發表評論。 –

+0

你說過「當你返回一個塊(Proc)時,它將從它被調用的方法返回」。但是我回來了,也不應該把這個返回值作爲p的參數。我的意思是爲什麼它需要一個新的方法來返回。 Proc.new或lambda不需要。我似乎無法得到這個。 –

0
def my_function(&block) 
    p block.call        #1 
    # lambda{return "inside the block"}.call #2 
end 

p my_function{return "implicit block"} 

爲什麼1號線給人一種LocalJumpError(ITS稱意想不到的回報)?

一個塊(和一個Procreturn從它們的封閉方法。在你的例子中,沒有封閉的方法(塊字面在頂層),因此沒有什麼來自return

Lambdas OTOH return從他們自己,就像方法。

def my_function(&block) 
    p block.call        #1 
    # lambda{return "inside the block"}.call #2 
end 

def abc 
    p my_function{return "implicit block"} 
end 

abc 

不應該工作的呢?

是的,它應該,而且確實如此。

爲了完整性:有方法/ lambdas和塊/ Proc秒之間差異:

  • 塊和從它們的包封方法,lambda表達式Proc小號return和方法return從自己。
  • Blocks和Proc s使用鬆散的參數綁定和類似於賦值的語義(事實上,在Ruby 1.9之前,他們使用了賦值語義),lambda表達式和方法使用嚴格的參數綁定。

這裏是一個樣 - 愚蠢的記憶我用「塊」和Proc韻和他們的行爲一樣,「方法」和「拉姆達」都是希臘語單詞和他們的行爲是相同的。