所以我试图在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 ,但为什么呢?
答案 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)