没有attr_accessor的等效ruby代码?

时间:2011-07-28 00:13:19

标签: ruby variables comparison instance

这是一个Java代码:

public class test{
     public static void main(String args[]){
     number A = new number();
     System.out.println(A.b);       
    }   
}

class number{
    int b = 100;    
}

没有attr_accessor,是否在ruby中有相同的上述代码?

为什么我们不能使用'。'访问成员变量。喜欢在java?还是有一种我不知道红宝石的方式......?

3 个答案:

答案 0 :(得分:5)

默认情况下隐藏实例变量。你可以通过使用instance_variable_get和instance_variable_set来解决这个问题,但这些都是私有的(如果必须的话,你也可以解决这个问题),因为这样做是不明白的。

在Ruby中,当你说foo.bar时,你在bar对象上调用foo方法(没有参数)。当您说foo.bar = 5时,您正在使用参数bar=调用5方法。

所有attr_accessor都会为您提供barbar=的实施,但是这样:

class MyClass
  attr_accessor :bar
end

相当于

class MyClass
  def bar
    @bar
  end

  def bar=(new_bar)
    @bar = new_bar
  end
end

如果您愿意,这可以让您稍后用其他内容替换实现。实例变量应该是该对象的私有变量,因此除非您正在进行重载元编程,否则我不建议尝试解决此问题。

答案 1 :(得分:3)

如果您只想传递结构化数据,那么您可以使用Ruby Struct类,它将更像您期望的示例:

Number = Struct.new(:value)
n = Number.new
n.value = 123
n.value # => 123

答案 2 :(得分:1)

使用Ruby的attr_accessor等效 。你为什么要避免它?

class number
  attr_accessor :b
end

然后你可以打电话

a = number.new
a.b = 1