Ruby 之 class 中的 private、 protected、public
Private
private权限的函数只能在本对象的成员函数中访问到。也就是这个函数只是这个对象的实现细节。
对象实例变量(@instance_attribute)的访问权限就是 private。
class A
private
def test_access
@instance_attribute = "instance_attribute";
return "test access right"
end
end
class B < A
def test
puts test_access;
puts @instance_attribute;
end
def test_other(a)
a.test_access
end
end
B.new.test # => test access right
# => instance_attribute
p A.new.test_private #错误test.rb:20: private method `test_access' called for #<A:0x3fd9064> (NoMethodError)
B.new.test_other(A.new) #错误test.rb:18: in `test_other': private method `test_access' called for #<A:0x4198850> (NoMethodError) from test.rb:24
Protected
protected 权限的函数只能在被本类或子类的 上下文中调用,但可以使用 other_object.function的形式。
这个的关键是可以调用 本类的其它对象的protected函数。
# Now make 'test' protect
class B
protected :test_access
end
p A.new.test_access # 错误 private method 'test_access'
B.new.test # test access right
p B.new.test_other(B.new) # test access right
p B.new.test_other(A.new) # 错误 private method 'test_access'
Public
public 函数可以在任何地方调用。成员函数和常量的默认访问权限就是public。
总结:
public, protected, private 效果上像是触发器,调用了一次,就改变了后续类成员的访问权限,这个和C++中情况很像。