在
Ruby中,我有这个类:
class Position attr_reader :x,:y def initialize(x,y) @x,@y = x,y end end
我想要做的是使用符号访问x和y变量,如下所示:
axis = :x pos = Position.new(5,6) #one way: pos.axis # 5 (pos.x) #other way: pos.get(axis) # 5 (pos.x)
感谢this question我发现这个代码,我可以实现第二个行为.
#... class Position def get(var) instance_variable_get(("@#{var}").intern) end end
但它看起来很丑陋和低效(特别是将符号转换为字符串并返回符号).有没有更好的办法?
解决方法
以下是两种技术的实现方法.假设我们已经有了你的类定义,
position = Position.new(1,2) axis = :x position.send axis #=> 1 axis = :y position.send axis #=> 2
Object#send方法至少接受一个表示要调用的方法名称的符号,并调用它.您也可以在名称和块之后将参数传递给方法.
class Position def get(axis) send axis end end position = Position.new(1,2) axis = :x position.get axis #=> 1 axis = :y position.get axis #=> 2