Ruby Получить массив из объектов, возвращаемых в блоке - PullRequest
1 голос
/ 05 октября 2010

В некоторых случаях в Ruby (ruby / gosu / texplay) я видел код, подобный следующему:

image.paint {
    circle 20, 20
    pixel 10, 10
}

Могу ли я написать аналогичную функцию, которую можно использовать, например, так:

my_function {
    "one"
    "two"
    "three"
}

, что бы вернуть и массив: ["один", "два", "три"]

p.s. эта функция предназначена не только для генерации массивов, и меня не интересуют методы для этого, все, что мне нужно знать, это синтаксис. Заранее спасибо, эл.

1 Ответ

3 голосов
/ 05 октября 2010

TexPlay выглядит красиво, как вы это нашли?:)

Я не могу придумать способ сделать то, что ты хочешь, извини.Но если вы добавите к каждой строке префикс _, это будет просто:

function {
    _"one"
    _"two"
    _"three"
}

#=> ["one", "two", "three"]

Где:

def function(&block)
    Object.new.tap do |s| 
        s.instance_eval do            
            def _(var)
                @val ||= []
                @val << var
            end
        end
        s.instance_eval(&block)
     end.instance_variable_get(:@val)
end    
...