Ruby相当于LINQ ToList()

时间:2012-01-31 16:30:52

标签: ruby

我是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>'

这种行为的正确咒语是什么?

2 个答案:

答案 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函数如果在调用它们时没有传递一个块,则返回一个枚举,但是如果它们传递一个块,它们将为块产生值。你也可以这样做。