ruby – 使用其名称(作为符号)访问实例变量

前端之家收集整理的这篇文章主要介绍了ruby – 使用其名称(作为符号)访问实例变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Ruby中,我有这个类:
  1. class Position
  2. attr_reader :x,:y
  3. def initialize(x,y)
  4. @x,@y = x,y
  5. end
  6. end

我想要做的是使用符号访问x和y变量,如下所示:

  1. axis = :x
  2. pos = Position.new(5,6)
  3. #one way:
  4. pos.axis # 5 (pos.x)
  5. #other way:
  6. pos.get(axis) # 5 (pos.x)

感谢this question我发现这个代码,我可以实现第二个行为.

  1. #...
  2. class Position
  3. def get(var)
  4. instance_variable_get(("@#{var}").intern)
  5. end
  6. end

但它看起来很丑陋和低效(特别是将符号转换为字符串并返回符号).有没有更好的办法?

解决方法

以下是两种技术的实现方法.假设我们已经有了你的类定义,
  1. position = Position.new(1,2)
  2. axis = :x
  3. position.send axis #=> 1
  4. axis = :y
  5. position.send axis #=> 2

Object#send方法至少接受一个表示要调用方法名称的符号,并调用它.您也可以在名称和块之后将参数传递给方法.

第二种方法(使用你的Position#get方法)是

  1. class Position
  2. def get(axis)
  3. send axis
  4. end
  5. end
  6.  
  7. position = Position.new(1,2)
  8. axis = :x
  9. position.get axis #=> 1
  10. axis = :y
  11. position.get axis #=> 2

我推荐这种方式,因为它封装了获取值的技术.如果您以后需要更改它,则无需更改使用Position的所有代码.

猜你在找的Ruby相关文章