如何在Ruby模块中声明函数

3
在下面的代码中,用不同的方式声明两个方法有什么区别。第二个方法使用了 Week,而第一个方法没有使用 Week。我们也无法通过类对象 d1 访问第二个方法。它会报错。
undefined method `weeks_in_year' for #<Decade:0x2c08a28> (NoMethodError)

那么,在第二种方法中使用Week前缀声明方法有什么用呢,当它没有用时。

module Week
   def weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   end
end

class Decade
   include Week
end

d1=Decade.new
d1.weeks_in_month
d1.weeks_in_year
1个回答

2
你定义的方法 weeks_in_yearWeek 类的类方法,而不是实例方法,这就是为什么它没有被继承,你遇到了错误。你可以使用module_function将同一个方法用作类方法或实例方法。
module Week
  def weeks_in_month
    puts "You have four weeks in a month"
  end

  def weeks_in_year
    puts "You have 52 weeks in a year"
  end

  module_function :weeks_in_year
end

class Decade
  include Week

  def wrapper_of_weeks_in_year
    weeks_in_year
  end
end

d1 = Decade.new

d1.weeks_in_month
# You have four weeks in a month
d1.wrapper_of_weeks_in_year
# You have 52 weeks in a year
Week.weeks_in_year
# You have 52 weeks in a year

虽然您会使用module_function,但是 实例方法版本将被私有化。这就是为什么您需要使用包装器方法来调用它,因为直接调用是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接