Ruby实例变量是否具有访问修饰符?

时间:2016-11-27 08:07:46

标签: ruby

所以我学到的是当我在一个对象上调用变量时,例如

my_object.variable

名为variable的方法返回variable

的值
def variable
   @variable
end

在Java中,有访问修饰符。如果getter方法以变量命名,Ruby如何使用访问修饰符?

2 个答案:

答案 0 :(得分:7)

首先,在回答问题之前,有一些术语需要清理。

一个是你永远不会“调用”变量。 Ruby表达式

my_object.variable

方法调用。没有变量调用这样的东西。你调用方法,而不是变量。即使该方法名为variable。 :)

第二个是你确实定义了这样的方法

def variable
   @variable
end

直接或通过说

attr_reader :variable

然后你有一个名为variable的方法和一个名为@variable的变量。

现在回答这个问题。

Ruby仅在方法上放置访问修饰符publicprotectedprivate,在变量上放置 not 。对变量的访问控制实际上没有意义,因为它们只能在对象的方法中引用,而且永远不会带有前缀!换句话说,你永远不能写下这个:

obj.@var

这只是一个语法错误。你可以写

obj.var

其中var是方法的名称。访问控制仅适用于该方法。

您可能正在制作具有相同名称的变量和方法(@除外)这一事实并不重要。只有方法才有访问控制。

希望这有助于澄清一些可以理解的混乱!

答案 1 :(得分:2)

有几种方法可以在Ruby中将方法设为私有。

使用private将所有后续方法设为私有:

class Foo
  def public_method
  end

private

  def private_method
  end
end

或者在定义方法后将方法设为私有:

class Foo
  def public_method
  end

  private :public_method # public_method is now private
end

或者 - 因为方法定义也返回一个符号 - 这也有效:

class Foo
  private def method_name
  end
end