例如,当我使用yield(param)但通过块{| p1,p2 | ...}它有两个参数。如果我不知道什么参数需要花费时间,我应该如何防止这种情况发生?如何防止参数在收益中不匹配时的情况?
回答
使用块中的图示,或简单地传递变量,可以在那里,测试它们的定义:
def foo
yield 1, 2, 3
end
foo do |*args|
if 3 == args.length
# ... then I know I'm dealing with 3 args
end
end
foo do |a, b, c, d|
if !d.nil?
# ... then I know i was passed `d`
end
end
但是这要求调用者(定义块的那个)负责检查块给出的参数,而这听起来像问题是询问如果被调用的方法在接受块错误的论点数量......除非我误解? – 2013-03-25 05:32:15
我把它理解为相反,但也许我是一个误解。这对我来说很有意义,因为在编写方法时,你知道你正在产生什么,但是在使用yield时,没有明确的方法来告诉将有多少参数传递给块。 – numbers1311407 2013-03-25 05:39:19
对,同意。在我的回答中,我试图向@ user1229490说明,使用方法块,实际上没有办法指出这一点,这意味着您需要使用其他类型的闭包之一,例如lambda(尽管您失去了语法糖) 。 – 2013-03-25 05:41:57
参见关于Ruby块,特效和Lambda表达式这个优秀的博客文章:
它解释说,块(如foo() {|p1,p2| ...}
传递的一个)像Proc S,它不检查传递的参数的数量。然而,兰巴达斯呢。因此,如果您需要严格检查参数的数量,则可能会从接受方法中的Block切换到接受Lambda作为方法参数。
您应该使用块参数而不是yield
,它提供比yield
更多的信息,例如arity。
def foo *params, &block
...
block.call(*params) if params.length == block.arity
...
end
foo(3){|x| puts x*3} # => 9
foo(3, 4){|x| puts x*3} # => Does not do anything
- 1. AWK收益相匹配
- 2. 与匹配时的情况
- 3. 如何在不停止程序的情况下更改参数
- 4. 防止日期不匹配
- 5. 如何处理List.First在C#中不匹配的情况?
- 6. 如何在不使用sync.WaitGroup的情况下防止死锁?
- 7. 如何在不停止的情况下回收IIS Express调试?
- 8. 如何在scala的情况下模式匹配偶数?
- 9. 如何防止多个RKResponseDescriptors匹配?
- 10. 如何防止在不使用JavaScript的情况下在ASP.NET MVC中双击?
- 11. 如何防止url参数?
- 12. 在某些情况下防止null
- 13. 在没有Vlookup的情况下匹配数组中的数据
- 14. 如何在OCaml中模式匹配相同的情况?
- 15. Prolog中的无限循环。我如何防止这种情况?
- 16. 如何在我的情况下防止竞争条件
- 17. Postgres的:如何防止INSERT在特殊情况下
- 18. 如何从收益函数
- 19. 默认情况下python-excel不匹配
- 20. 防止重复UltiSnips匹配
- 21. 防止蜘蛛匹配URL
- 22. 防止提交字段不匹配
- 23. 我们如何将不同的匹配情况用于聚合?
- 24. 如何在不使用UDF的情况下在PIG中获得匹配值?
- 25. 防止grep在输入不匹配时返回错误
- 26. JTextArea不断在for循环中添加行,如何防止这种情况?
- 27. 如何防止两个路由在react-router v4中匹配?
- 28. system.reflection.targetparametercountexception参数数量不匹配参数数量不匹配
- 29. 如何在不使用C++ 0x的情况下创建一个lambda函数来匹配boost :: function参数?
- 30. 如何防止Windows.Forms.TabControl在某些情况下切换选项卡?
它是如何产生的问题?我测试了这个,它在Ruby 1.9.3中工作正常。你可以编辑和添加一个不适合你的简单测试用例 – 2013-03-25 05:02:32
从逻辑上说,你希望yield只能处理一个参数,但实际上你只能传递两个参数。所以这在逻辑上不正确,是吗? – OneZero 2013-03-25 05:05:08
目前尚不清楚“防”的含义。你想静静地取消参数应用到'yield',还是你想提出一个错误? – sawa 2013-03-25 05:08:45