这是一个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?还是有一种我不知道红宝石的方式......?
答案 0 :(得分:5)
默认情况下隐藏实例变量。你可以通过使用instance_variable_get和instance_variable_set来解决这个问题,但这些都是私有的(如果必须的话,你也可以解决这个问题),因为这样做是不明白的。
在Ruby中,当你说foo.bar
时,你在bar
对象上调用foo
方法(没有参数)。当您说foo.bar = 5
时,您正在使用参数bar=
调用5
方法。
所有attr_accessor
都会为您提供bar
和bar=
的实施,但是这样:
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