Рубиновый эквивалент LINQ ToList () - PullRequest
3 голосов
/ 31 января 2012

Я новичок в 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 ]

5 голосов
/ 31 января 2012

Правильный синтаксис для вашего кода:

to_enum(:my_block).to_a # => [1,2,3]

Object # to_enum ожидает символ с именем метода в качестве параметра:

to_enum (метод =: каждый, * аргументы) enum_for (method =: each, * args)

Создает новый перечислитель, который будет перечислять при вызове метода для obj.

Эквивалент для C # ToList() is Enumerable # to_a

to_a → массив entry → array

Возвращает массив, содержащий элементы в enum.

1 голос
/ 31 января 2012

Вы можете изменить свою функцию, чтобы она возвращала 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 / ядро-1.9.3 / Enumerable.html

Многие функции ruby ​​в стандартной библиотеке будут возвращать перечислимое, если им НЕ передается блок при вызове, но если им передается блок, они возвращают значения блоку. Вы тоже можете это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...