此代码适用于:
class TestPluralize
def pluralize(value)
value != 1 ? 's' : ''
end
def test_it(v)
pluralize(v)
end
end
t = TestPluralize.new
#=> #<TestPluralize:0xb7f55a70>
t.test_it(5)
#=> "s"但我想让pluralize私人化。所以我做了这个:
class TestPluralize
class << self
private
def pluralize(value)
value != 1 ? 's' : ''
end
end
def test_it(v)
self.pluralize(v)
end
end
t = TestPluralize.new
#=> #<TestPluralize:0xb8831b80>
t.test_it(5)
NoMethodError: undefined method `pluralize' for #<TestPluralize:0xb8831b80>
from (irb):10:in `test_it'
from (irb):15
from /usr/local/bin/irb:11:in `<main>'我做错了什么?
发布于 2015-07-26 13:48:50
你在你的例子中改变了两件事:
pluralize是否是privateprivate是一个红鲱鱼,无论pluralize是否为private,您都会得到相同的错误。(请注意,错误不是“私有方法调用”,而是“未定义方法”!)在第二种情况下,您在一个与第一个示例完全不同的类中定义pluralize。在您的第一个示例中,pluralize是在TestPluralize中定义的方法,而在第二个示例中,它是TestPluralize的单例类中的一个方法(第一个有时也称为“实例方法”,第二个称为“类方法”,尽管这并不是真正正确的,因为区别不是在方法中,而是在定义它们的类中)。
你可以做这三个中的一个:
class TestPluralize
private def pluralize(value)
value != 1 ? 's' : ''
end
def test_it(v)
pluralize(v)
end
end
class TestPluralize
def pluralize(value)
value != 1 ? 's' : ''
end
private :pluralize
def test_it(v)
pluralize(v)
end
end
class TestPluralize
private
def pluralize(value)
value != 1 ? 's' : ''
end
public # or just switch the two methods around
def test_it(v)
pluralize(v)
end
end发布于 2015-07-26 13:26:44
如果您只想使pluralize私有,您可以添加private :pluralize使该方法私有(另一种方法是拥有private,然后您希望成为私有的所有方法都会在类中落在后面,但是第一种方法允许这样做,只需更改一行)。
class TestPluralize
def pluralize(value)
value != 1 ? 's' : ''
end
def test_it(v)
pluralize(v)
end
private :pluralize
end有关私有方法的更多详细信息,请参见Programming/Syntax/Classes#Private。
发布于 2015-07-26 23:31:20
您也可以在定义#pluralize之后定义#test_it。这样,#test_it就会保持公开,而#pluralize就会成为私有的。在类中定义方法的顺序并不重要,但#initialize是第一位的。
https://stackoverflow.com/questions/31637420
复制相似问题