是否有可能比较Ruby中的私有属性?

datque 发布于 2019-11-10 attributes 最后更新 2019-11-10 12:10 267 浏览

我在想:

class X
    def new()
        @a = 1
    end
    def m( other ) 
         @a == other.@a
    end
end
x = X.new()
y = X.new()
x.m( y ) 
但它不起作用。 错误消息是:
syntax error, unexpected tIVAR
我如何才能比较来自同一类的两个私有属性呢?
已邀请:

fdolor

赞同来自:

内容太长未翻译

kaut

赞同来自:

有几种方法 消气:

class X
  attr_reader :a
  def m( other )
    a == other.a
  end
end
instance_eval
class X
  def m( other )
    @a == other.instance_eval { @a }
  end
end
instance_variable_get
class X
  def m( other )
    @a == other.instance_variable_get :@a
  end
end
我不认为ruby有“朋友”或“受保护”访问的概念,甚至“私人”也很容易被攻击。使用getter创建只读属性,而instance_eval意味着您必须知道实例变量的名称,因此内涵类似。

uvero

赞同来自:

如果您不使用instance_eval选项(发布@jleedev),并选择使用getter方法,您仍然可以保留protected 如果你想在Ruby中使用protected方法,只需执行以下操作即可创建一个只能从同一个类的对象中读取的getter:

class X
    def new()
        @a = 1
    end
    def m( other ) 
        @a == other.a
    end
protected
    def a 
      @a
    end
end
x = X.new()
y = X.new()
x.m( y ) # Returns true
x.a      # Throws error

nrerum

赞同来自:

不确定,但这可能会有所帮助: 在课堂之外,它有点难:

# Doesn't work:
irb -> a.@foo
SyntaxError: compile error
(irb):9: syntax error, unexpected tIVAR
        from (irb):9
# But you can access it this way:
irb -> a.instance_variable_get(:@foo)
    => []
http://whynotwiki.com/Ruby_/_Variables_and_constants#Variable_scope.2Faccessibility