如何在ruby中声明模块中的函数

时间:2015-08-20 14:47:50

标签: ruby

在下面的代码中,以不同方式声明两种方法之间的区别是什么。第二种方法是使用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 个答案:

答案 0 :(得分:2)

您定义方法weeks_in_year的方式是Week类的类方法,而不是实例方法。这就是为什么它没有得到继承而且你发布了错误。

您可以使用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,但将实例方法版本设为私有。这就是为什么你需要使用包装器方法来调用它,因为无法进行直接调用。