在Ruby中调用类实例方法

时间:2014-07-21 19:27:19

标签: ruby

我是红宝石的新手,我正在学习课程。

如果我要上课

class Book
  private
  def BookTitle
    puts "this books title"
  end
end

a = Book.new
a.BookTitle

produces a NoMethodError

我可以访问类方法的唯一方法是使用此行吗?

attr_accessor :BookTitle

4 个答案:

答案 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

在第二行,这是阻止您访问此方法的原因。您可以在私有线上方声明该方法,它将是公共的。