2016-08-01 91 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