"abcdeabcabc".scan("a")
所以它返回一个3 a的数组.另一个扫描示例:
"abcdeabcabc".scan("a") {|x| puts x}
它只输出每个“a”,但仍然输出一个数组,这次它实际上是它返回的原始字符串.
因此,从上面的文档和行为中,扫描要么返回一个数组(没有给出块),要么返回原始字符串,在此之前会发生一些副作用.关键是两种情况都会返回一些东西.
那么如果我在块中放置“收益”会发生什么?什么将被退回?或者,没有?返回值的类型是什么?
"abcdeabcabc".scan("a") {|x| yIEld x}
上面的内容不起作用,因为Ruby抱怨没有给出任何阻止.这对我来说很有意义.但是,如果它是类方法的一部分,比如说,自我实现的“每个”,则以下工作:
class Test def my_each "abcdeabcabc".scan("a") {|x| yIEld x} endend# => :my_eacht = Test.new# => #<Test:0x007ff00a8d79b0>t.my_each {|x| puts "so this is #{x}"}# it works. Outpus 3 a's then return the original string.
那么,Test类的my_each方法的返回值是多少?这是收益率列表还是什么?但正如之前所讨论的“abcdeabcabc”.scan(“a”){| x |在给出一个块之前,Ruby会抱怨yIEld x}段.内部发生了什么事情,将my_each块提供给my_each实现中的段?
解决方法 该块与该函数的参数类似地传递.这可以明确指定,如下所示:class Test def my_each(&block) "abcdeabcabc".scan("a") do |x| puts "!!! block" yIEld x # Could be replaced with: block.call(x) end endend
从技术上讲,它完全相同(放在那里澄清),它的存在不会像通常为参数做的那样进行检查.如果你忘记给它一个块,函数将停止它必须执行的第一个yIEld与完全相同的LocalJumpError(至少,这是我得到的Rubinius).但是,请注意控制台中的“!!! block”.
这样做是有原因的.您可以检查您的函数是否被赋予块,如果使用if块明确指定,则跳过yIEld.一个很好的例子是Rails的content_tag帮助器.这个助手的调用可以是块嵌套的.一个简单的例子:
content_tag :div do content_tag :divend
……产生如下输出:
<div> <div></div></div>
因此,块在您的方法的“顶部”(就调用堆栈而言)执行.每次产量发生时都会调用它,就像块上的某种函数调用一样.之后执行块时,它不会累积在任何地方.
UPD:
许多eaches返回的枚举器由许多迭代器显式构造,以保存应该发生的事件的上下文.
它可以像my_each一样实现:
class Test def my_each(&block) if block "abcdeabcabc".scan("a") { |x| yIEld x } else Enumerator.new(self,:my_each) end endend总结
以上是内存溢出为你收集整理的Ruby:块内的收益率全部内容,希望文章能够帮你解决Ruby:块内的收益率所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)