2010-10-04 2 views
1

В Ruby, в некоторых случаях (рубин/Gosu/texplay) I'v видели подобный код используется:рубин Получить массив из объектов, возвратившихся в блоке

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

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

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

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

п.с. эта функция предназначена не только для создания массивов, и мне не интересно, как это сделать, все, что мне нужно знать, это синтаксис. Спасибо заранее, ell.

ответ

3

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  
+1

Я нашел его в форумах Gosu :) Я использую Gosu, потому что его самый простой 2d библиотека для Ruby, я мог бы найти ! Спасибо за этот пример, его блестящий и говорит мне, что мне нужно знать. еще раз спасибо – Ell