2016-01-01 9 views
1

Можно ли создать копию объекта с атрибутом, установленным в Ruby?Копия объекта с атрибутом, установленным в ruby ​​

Конечно, метод может быть определен, чтобы сделать это -

class URI::Generic 
    def with_query(new_query) 
    ret = self.dup 
    ret.query = new_query 
    ret 
    end 
end 

Но это может получить немного утомительным, чтобы сделать с каждым атрибутом.

ответ

2

Вы можете использовать хеш-параметры для передачи нескольких пар атрибут-значение. Вот пример.

class Sample 
    attr_accessor :foo, :bar 

    def with(**options) 
    dup.tap do |copy| 
     options.each do |attr, value| 
      m = copy.method("#{attr}=") rescue nil 
      m.call(value) if m 
     end 
    end 
    end 

end 


obj1 = Sample.new 
#=> #<Sample:0x000000029186e0> 
obj2 = obj1.with(foo: "Hello") 
#=> #<Sample:0x00000002918550 @foo="Hello"> 
obj3 = obj2.with(foo: "Hello", bar: "World") 
#=> #<Sample:0x00000002918348 @foo="Hello", @bar="World"> 

# Options hash is optional - can be used to just dup the object as well 
obj4 = obj3.with 
#=> #<Sample:0x0000000293bf00 @foo="Hello", @bar="World"> 

PS: Там может быть несколько variations о том, как реализовать хеш опций, однако, суть подхода будет более или менее одинаковы.

+0

Предположительно, необходимо выполнить некоторую проверку на attr, чтобы убедиться, что это допустимое имя атрибута? –

+0

@GeorgeSimms Обновлен ответ для проверки существования метода. –

 Смежные вопросы

  • Нет связанных вопросов^_^