2015-12-23 2 views
3

Возможно ли инициализировать экземпляр объекта, выполнить операцию над ним и вернуть этот экземпляр без создания временной переменной?Ruby: Инициализировать экземпляр объекта с помощью блока

Например:

def create_custom_object 
    Object.new do |instance| 
    instance.define_singleton_method(:foo) { 'foo' } 
    end 
end 
# returns an instance, but defines nothing :(
def create_custom_object 
    Object.new do 
    self.define_singleton_method(:foo) { 'foo' } 
    end 
end 
# same thing 

вместо:

def create_custom_object 
    object = Object.new 
    object.define_singleton_method(:foo) { 'foo' } 
    object 
end 

ответ

4

Вы можете использовать tap:

Урожайность себя к блоку, а затем возвращает себя.

Пример:

def create_custom_object 
    Object.new.tap { |o| o.define_singleton_method(:foo) { 'foo' } } 
end 

object = create_custom_object 
#=> #<Object:0x007f9beb857b48> 

object.foo 
#=> "foo" 
Смежные вопросы