我是红宝石的新手,我正在学习课程。
如果我要上课
class Book
private
def BookTitle
puts "this books title"
end
end
a = Book.new
a.BookTitle
produces a NoMethodError
我可以访问类方法的唯一方法是使用此行吗?
attr_accessor :BookTitle
答案 0 :(得分:2)
在您的示例中,BookTitle
未定义为类方法。
要定义类方法,请在方法名称前加上self.
(还有其他方法,但现在可能不值得担心)。但是,我认为你指的是实例方法而不是类方法。
您无法直接调用BookTitle方法,因为您已将其定义为私有方法。如果您删除示例中的private
行,则可以毫无困难地调用该方法。
答案 1 :(得分:1)
您的方法是私有的,因此您无法在全局范围内访问它(请参阅此irb extract):
irb(main):001:0> class Book
irb(main):002:1> private
irb(main):003:1> def BookTitle
irb(main):004:2> puts "this books title"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0>
irb(main):008:0* a = Book.new
=> #<Book:0x105ceb8>
irb(main):009:0> a.BookTitle
NoMethodError: private method `BookTitle' called for #<Book:0x105ceb8>
from (irb):9
from D:/dev/Ruby193/bin/irb:12:in `<main>'
irb(main):010:0>
答案 2 :(得分:1)
您已将BookTitle设置为private
方法。 private
方法只能在类本身或类的实例中调用(有例外)。如果你取出private
,它应该有效。
一些注意事项:Ruby约定的方法名称为小写,单词用下划线分隔,因此您应该将方法命名为book_title
。
另外,小秘密,Ruby的私有方法都不是私密的,你可以调用a.send("BookTitle")
然后就行了。
答案 3 :(得分:1)
您已设置
private
在第二行,这是阻止您访问此方法的原因。您可以在私有线上方声明该方法,它将是公共的。