我正在尝试在 Ruby 中为自己使用访问修饰符。我有:
class Person
def initialize (first_name, last_name, age)
@first_name=first_name
@last_name=last_name
@age=age
end
def show()
puts @first_name
puts @last_name
puts @age
end
protected
def compare(other)
self.instance_variable_get(:@age)<=>other.instance_variable_get(:@age)
end
end
p1=Person.new("Some", "Body", "99")
p1.show
puts "\n"
p2=Person.new("Who", "Ever", "21")
p2.show
puts "\n"
p1.compare(p2)
我收到错误“为 # (NoMethodError) 调用了受保护的方法‘比较’”
我尝试过在班内和班外打电话。我把没有的版本粘贴在这里。我认为受保护的方法可以在同一类的其他对象上调用。这个错误是什么意思以及我如何在这里正确使用受保护的方法?感谢您的帮助。
你对这个问题的看法是错误的protected
能见度。这Ruby doc http://www.ruby-doc.org/core-2.1.2/doc/syntax/modules_and_classes_rdoc.html#label-Visibility says:
第二可见性受到保护。调用受保护方法时发件人必须是接收者的子类,或者接收者必须是发送者的子类。否则将引发 NoMethodError。
所以可见性的限制适用于发件人,而不是您想象的接收器。
如果你想打电话compare
在实例方法之外,您需要使用公共可见性。您需要删除protected
如果可以的话修改器。这是推荐的方式。
如果代码是固定的并且您无法修改该代码段,则可以使用Object#send http://www.ruby-doc.org/core-2.1.2/Object.html#method-i-send方法。Object#send
将绕过可见性约束,甚至可以访问私有方法。
p1.send(:compare, p2)
或者您可以重新打开课程并更改课程的可见性compare
class:
# you code here
# reopen and modify visibility
class Person
public :compare
end
p1.compare(p2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)