Ruby 在属性名称中使用插值(避免求值)

Ruby 在属性名称中使用插值(避免求值),ruby,attributes,string-interpolation,Ruby,Attributes,String Interpolation,我正在定义自己的方法,该方法允许我将给定对象的多个属性更新为另一个对象的属性new\u car。许多属性都有类似的名称,例如“entered_text_1”、“entered_text_2”、“entered_text_3”到“entered_text_10”(在下面的示例中,我只做了3个来说明) 问题 想知道如何在属性名本身中使用插值,例如car.entered_text_35;{i} (这是不正确的) 期望的结果 下面的代码可以正常工作并完成我想要的功能,但是我看到了大量关于使用eval的警

我正在定义自己的方法,该方法允许我将给定对象的多个属性更新为另一个对象的属性
new\u car
。许多属性都有类似的名称,例如“entered_text_1”、“entered_text_2”、“entered_text_3”到“entered_text_10”(在下面的示例中,我只做了3个来说明)

问题

想知道如何在属性名本身中使用插值,例如
car.entered_text_35;{i}
(这是不正确的)

期望的结果

下面的代码可以正常工作并完成我想要的功能,但是我看到了大量关于使用
eval
的警告,我想知道在这种情况下更好的替代方案是什么

# class Car and class NewCar exist with the same attribute names (:entered_text_1, :entered_text_2, :entered_text_3)

def self.copy_attributes(car, new_car)
  i = 1
  until i > 3
    eval("car.entered_text_#{i} = new_car.entered_text_#{i}")
    puts eval("car.entered_text_#{i}")
    i += 1
  end

end

current_car = Car.new('White', 'Huge', 'Slow')
golf = NewCar.new('Red', 'Small', 'Fast')

copy_attributes(current_car, golf)

# => Red, Small, Fast

非常感谢

您可以使用这样一个事实:像
user.name='John'
这样的赋值实际上是方法调用,可以这样编写:
user.name=('John')
,其中
name=
是方法的名称。我们可以使用
send
(调用任何方法)或
public\u send
(调用公共方法,如果方法存在但是私有的,将引发错误)


您可以使用这样一个事实:像
user.name='John'
这样的赋值实际上是方法调用,可以这样编写:
user.name=('John')
,其中
name=
是方法的名称。我们可以使用
send
(调用任何方法)或
public\u send
(调用公共方法,如果方法存在但是私有的,将引发错误)


啊,太好了,这正是我要找的东西。看起来应该更新括号
car.send((“entered_text#{i}=”),new_car.send(“entered_text#{i}”))
,使其工作,但它确实起到了作用。谢谢@啊,对了,忘了一个右括号。谢谢你的关注。您不需要单独插入字符串(第一个参数),我建议使用
public\u send
而不是
send
。啊,太好了,这正是我想要的。看起来应该更新括号
car.send((“entered_text#{i}=”),new_car.send(“entered_text#{i}”))
,使其工作,但它确实起到了作用。谢谢@啊,对了,忘了一个右括号。谢谢你的关注。您不需要单独插入字符串(第一个参数),我建议您使用
public\u send
而不是
send
car.public_send("entered_text_#{i}=", new_car.public_send("entered_text_#{i}"))
puts car.public_send("entered_text_#{i}")