加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:40:45 所属栏目:百科 来源:网络整理
导读:在 Ruby中,我有这个类: class Position attr_reader :x,:y def initialize(x,y) @x,@y = x,y endend 我想要做的是使用符号访问x和y变量,如下所示: axis = :xpos = Position.new(5,6) #one way:pos.axis # 5 (pos.x) #other way:pos.get(axis) # 5 (pos.x)
在 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方法至少接受一个表示要调用的方法名称的符号,并调用它.您也可以在名称和块之后将参数传递给方法.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读