block_given?总是返回false

时间:2016-08-01 17:39:27

标签: ruby-on-rails ruby

所以我试图在Ruby中编写method_missing,method_missing有三个参数如图所示

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 个答案:

答案 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:0x007fabd313d090@(irb):8>
true
 => true  

答案 1 :(得分:0)

这一点令人费解。

block_given没有任何问题,除了您的支票嵌套在“if else”区块中。 (那太长了;没有阅读摘要)

如果你没有将任何参数传入你的函数,你只会看到“有代码给出”。传入参数会触发!args.entries.empty? if,if匹配并且不执行任何其他语句。

(在家尝试:尝试调用你的方法,不带参数,只调用一个块,然后使用参数和块)。

如果您的预期/期望输出是: there was arguments given there was ?code given

然后尝试使用此方法。请注意我如何将您的elsif if语句作为 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
语句:

PhoneStatusBar: couldn't inflate view for notification it.Ettore.calcolielettrici/0x647980 android.content.res.Resources$NotFoundException: Resource ID #0x1090087 at android.content.res.Resources.getValue(Resources.java:1014) at android.content.res.Resources.loadXmlResourceParser(Resources.java:2039) at android.content.res.Resources.getLayout(Resources.java:853) at android.view.LayoutInflater.inflate(LayoutInflater.java:389) at android.widget.RemoteViews.apply(RemoteViews.java:1490) at com.android.systemui.statusbar.phone.PhoneStatusBar.makeNotificationView(PhoneStatusBar.java:529) at com.android.systemui.statusbar.phone.PhoneStatusBar.addNotificationViews(PhoneStatusBar.java:558) at com.android.systemui.statusbar.phone.PhoneStatusBar.addNotification(PhoneStatusBar.java:339) at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:218) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:126) at android.app.ActivityThread.main(ActivityThread.java:3997) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:491) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method)