我是Ruby的新手,我该怎么办?在C#中,我会写
my_block().ToList()
它会起作用。
我正在想象这个功能
def my_block
yield 1
yield 2
yield 3
end
my_block.to_enum().map {|a| a}
这给了我这个错误:
test.rb:2:in `my_block': no block given (yield) (LocalJumpError)
from test.rb:7:in `<main>'
这种行为的正确咒语是什么?
答案 0 :(得分:5)
代码的正确语法是:
to_enum(:my_block).to_a # => [1,2,3]
Object#to_enum期望带有方法名称的符号作为参数:
to_enum(method =:each,* args)
enum_for(method =:each,* args)创建一个新的枚举器,它将通过调用obj。
上的方法进行枚举
C#ToList()
的等效项为Enumerable#to_a
to_a →数组条目→数组
返回包含枚举项目的数组。
答案 1 :(得分:1)
您可以更改您的功能,使其返回Enumerable。以下是一个示例:
def foo
Enumerator.new do |y|
y << 1
y << 2
y << 3
end
end
p foo # => <Enumerator: #<Enumerator::Generator:0x1df7f00>:each>
p foo.to_a # => [1, 2, 3]
p foo.map { |x| x + 1 } # => [2, 3, 4]
然后您可以使用Enumerable模块中的任何方法:
http://ruby-doc.org/core-1.9.3/Enumerable.html
标准库中的许多ruby函数如果在调用它们时没有传递一个块,则返回一个枚举,但是如果它们传递一个块,它们将为块产生值。你也可以这样做。