在下面的代码中,以不同方式声明两种方法之间的区别是什么。第二种方法是使用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
答案 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
,但将实例方法版本设为私有。这就是为什么你需要使用包装器方法来调用它,因为无法进行直接调用。