在
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