【问题标题】:How do I ask a Ruby method to use a member variable?如何让 Ruby 方法使用成员变量?
【发布时间】:2016-02-23 12:20:53
【问题描述】:

我有这个 Ruby 课程:

class Drive

    attr_accessor :pitch, :ring, :sprocket, :links

    def initialize pitch,ring,sprocket,links
        @pitch = pitch
        @ring = ring
        @sprocket = sprocket
        @links = links
    end

    def teeth2radius choice
        return ((pitch * choice) / (Math::PI * 2));
    end

    def ring2sprocket
        return ((pitch / 8) * ((2 * links - ring - sprocket) + Math.sqrt(((2 * links - ring - sprocket) * (2 * links - ring - sprocket)) - (8 / (Math::PI * Math::PI)) * (( ring - sprocket) * ( ring - sprocket)))))
    end

end

我想通过传递两个成员变量之一的-name- 来调用tooth2radius 方法。像这样:

teeth2radius :ring

  -OR-

teeth2radius :sprocket

Drive 对象同时包含它们,我只想用其中一个来调用它。

有没有办法做到这一点?

【问题讨论】:

  • 类和方法的思想是封装,成员变量是一个实现细节,你通常不应该将它们暴露给你的方法接口。
  • 为什么要定义 getter 然后绕过它们?

标签: ruby variables methods call member


【解决方案1】:
def teeth2radius choice
    choice = method(choice).call # or: choice=instance_variable_get("@#{choice}")  
    return ((pitch * choice) / (Math::PI * 2));
end

【讨论】:

    【解决方案2】:

    您正在寻找instance_variable_get

    使用这个方法,你可以在你的函数中使用:

    def teeth2radius choice
        return ((pitch * instance_variable_get("@#{choice}")) / (Math::PI * 2));
    end
    

    【讨论】:

    • 是的,就是这样。我现在可以用 :ring 或 :sprocket 来调用它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多