Ruby中类似于LINQ ToList()的方法是什么?

3

我刚接触 Ruby,我该如何像 C# 中这样做?在 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>'

这种行为的正确口诀是什么?
2个回答

5
您的代码的正确语法应为:
to_enum(:my_block).to_a # => [1,2,3]

Object#to_enum期望以方法名作为其参数的符号:

to_enum(method =:each,* args)
enum_for(method =:each,* args)

创建一个新的Enumerator,它将通过调用obj上的方法进行枚举。

C#的等效ToList() Enumerable#to_a

to_a →数组
entries →数组

返回包含枚举中项目的数组。


1
你可以修改你的函数,使其返回一个可枚举对象。以下是一个示例:
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 函数在调用时如果没有传递块参数,将返回一个可枚举对象,但如果传递了块参数,它们将向块中传递值。你也可以这样做。

小修正,Ruby 1.9中这样的函数将返回Enumerator,而不是您在答案中可能误打成的Enumerable。 Enumerator包括Enumerable模块。 - Aliaksei Kliuchnikau
是的。函数返回的对象是一个枚举器,也是可枚举的。foo.is_a?(Enumerable) 返回 true。我认为在多重继承中,可以说一个对象是多个东西。我并不特别关心函数是否返回一个枚举器,我只关心它是否返回一个可枚举的对象,因为这决定了我是否可以使用所有有用的方法,如 collectselect - David Grayson
谢谢David,我不知道这个方法。我可以看到在构建更好的库方面它是有帮助的。对于我的需求,Alex的方法更简洁,而且不需要我改变被调用的函数,只需要改变调用者。话虽如此,你的答案仍然是正确的。但我想我只能选一个答案... - Doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接