此代码有效:
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>'
我做错了什么?
答案 0 :(得分:1)
如果您只想将pluralize
设为私有,则可以添加private :pluralize
以将该方法设为私有(另一种方法是private
,然后将所有方法设为私有在课堂上落后,但第一种方式只允许改变一行,这样做。)
class TestPluralize
def pluralize(value)
value != 1 ? 's' : ''
end
def test_it(v)
pluralize(v)
end
private :pluralize
end
有关私有方法的详细信息,请参阅https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private。
答案 1 :(得分:1)
您正在更改示例中的两个事项:
pluralize
是private
private
在这里是一个红色鲱鱼,无论pluralize
是否为private
,您都会得到完全相同的错误。 (请注意,错误是不是&#34;私有方法称为&#34;而是&#34;未定义的方法&#34;!)在第二种情况下,您正在定义pluralize
在与第一个例子完全不同的类中。在您的第一个示例中,pluralize
是TestPluralize
中定义的方法,而在第二个示例中,它是TestPluralize
单例类中的方法(第一个也是称为&#34;实例方法&#34;以及第二个&#34;类方法&#34;,虽然这不是真的正确,因为差异不在方法中,而是在哪个类中定义它们在)。
你可以做以下三种中的一种:
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
答案 2 :(得分:0)
您还可以在定义#pluralize
后定义#test_it
。这样,#test_it
保持公开,#pluralize
变为私有。除了#initialize
之外,在类中定义方法的顺序并不重要。