2016-08-01 90 views
-1

所以我想寫Ruby中的method_missing,該method_missing方法有三個參數,如圖block_given?始終返回false

def method_missing(mId,*args,&block) 
    if (args.empty? && !block_given?) 
      puts " Sample One No arguments were given nor block" 
     elsif (!args.entries.empty?) 
      puts " there was arguments given" 
     elsif (block_given?) 
      puts "there was ?code given" 
    end 
end 

問題致電instance.anything {「塊」}總是返回「樣品中的一個沒有論據給定也不阻止「。 很明顯,block_given總是返回false,但是爲什麼?

+2

無法重現:'Foo.new.anything {}#有代碼given' –

回答

0

這一個花了一些令人費解。

block_given沒有問題,除了您的支票嵌套在「if else」塊中。 (這是太長;沒有閱讀總結)

如果你沒有參數傳入你的函數,你只會看到「有代碼給出」。傳入參數將觸發!args.entries.empty?,如果if得到匹配並且任何其他else語句不被執行。

(在家中嘗試:嘗試調用沒有參數,只是一個塊,然後用參數和塊的方法)。

如果你的預期/所需的輸出是: there was arguments given there was ?code given

那就試試這個方法來代替。注意:我是怎樣使你最後elsifif聲明:

def method_missing(mId,*args,&block) if (args.empty? && !block_given?) puts " Sample One No arguments were given nor block" elsif (!args.entries.empty?) puts " there was arguments given" end if (block_given?) puts "there was ?code given" end
end

+0

在問題的最後一行時,OP寫道,調用'instance.anything {「塊」 }',即沒有參數,但有一個塊也行不通,這與你的解釋不符。 –

+0

沒有工作它執行也放入「示例一沒有參數給出也不阻止」 –

1

你在你的方法有一點過於複雜的邏輯,這就是最主要的原因,它不會按照你的期望工作。有沒有問題block_given?

此外,我沒有看到args.entries.empty?用法的任何理由。 args.empty?會給出相同的結果,但看起來更清楚。

原始方法可以像這樣重寫,但我會注意到,當方法可以使用參數和塊調用時,您並未覆蓋這種情況。我不知道這是否是一個意圖。

def method_missing(mid, *args, &block) 
    if args.count > 0 
    puts "there were arguments found" 
    else 
    if block_given? 
     puts "there was a code found" 
    else 
     puts "Sample One No arguments were given nor block" 
    end 
    end 
end 

舉例說明block_given?正常工作:

class A 
    def method_missing(mid, *args, &block) 
    p block 
    p block_given? 
    end 
end 

A.new.aaaa 
nil 
false 
=> false 

A.new.aaaa { "aaaa" } 
#<Proc:[email protected](irb):8> 
true 
=> true 
+0

我不想要某些過程發生時,有一個空的1空參數,2鍵值對已被傳遞參數,3塊代碼已通過。 考慮到當傳遞代碼塊的時候,會給出也滿足條件1的參數。 –

+0

如果你想檢查關鍵字參數是否在方法中傳遞,那麼使用雙splat表示法將它們收集到變量中,然後引用到這個哈希類型的變量。 method_missing(mid,* args,** kwargs,&block) https://flushentitypacket.github。io/ruby​​/2015/03/31/ruby​​-keyword-arguments-the-double-splat-and-starsnake.html http://stackoverflow.com/questions/18289152/what-does-a-double-splat-運營商-DO – SunnyMagadan