以下是扫描示例:
所以它返回一个包含3个“a”的数组。 scan的另一个示例:
以上内容无法正常工作,因为Ruby会抱怨没有给出块。这对我来说有些合理。但是如果它是类方法的一部分,比如自己实现的“each”方法,那么下面的代码可以正常工作:
那么,Test类的my_each方法的返回值是什么?是yield的列表还是其他什么东西?但是如前所述,“abcdeabcabc”。scan(“a”){|x| yield x}段将被Ruby抱怨,直到给定了一个块。在my_each实现的内部,发生了什么使得my_each的块传递给my_each内部的段落?
这里是一个扫描示例:
"abcdeabcabc".scan("a")
所以它返回一个包含3个“a”的数组。 scan的另一个示例:
"abcdeabcabc".scan("a") {|x| puts x}
这段代码每次输出一个 "a",但依然会输出一个数组,而这次实际返回的却是原始字符串。
因此,从文档和上面的行为来看,scan 要么返回一个数组(没有给出 block),要么在一些副作用发生之前返回原始字符串。重点是两种情况都会返回某些东西。
那么,如果我在 block 中放置一个 "yield",会发生什么?会返回什么? 或者不会返回任何东西?返回值的类型会是什么?
"abcdeabcabc".scan("a") {|x| yield x}
以上内容无法正常工作,因为Ruby会抱怨没有给出块。这对我来说有些合理。但是如果它是类方法的一部分,比如自己实现的“each”方法,那么下面的代码可以正常工作:
class Test
def my_each
"abcdeabcabc".scan("a") {|x| yield x}
end
end
# => :my_each
t = 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方法的返回值是什么?是yield的列表还是其他什么东西?但是如前所述,“abcdeabcabc”。scan(“a”){|x| yield x}段将被Ruby抱怨,直到给定了一个块。在my_each实现的内部,发生了什么使得my_each的块传递给my_each内部的段落?
each
将返回一个Enumerator
。这是显式完成的:如果没有给出块,则构造一个Enumerator
并附带上下文以重现该each
:一个对象,一个迭代器方法及其参数。在irb中尝试:e = 1.upto(5)
。检查e
。 - D-sidescan
的情况下,它是处理过的原始字符串。如果存在块,在我的例子中,这将是最后一个表达式。否则,它将是一个枚举器。是的,返回类型并不清楚,但由于差异只在不同的使用场景中才可见,这是最好的方式。 - D-side