我在为Rails应用程序创建函数时遇到了一些问题。
我希望它能像这样工作:
str = "string here"
if str.within_range?(3..30)
puts "It's withing the range!"
end
为此,我将其添加到我的应用程序助手中:
def within_range?(range)
if self.is_a?(String)
(range).include?(self.size)
elsif self.is_a?(Integer)
(range).include?(self)
end
end
我收到此错误:
undefined method `within_range?' for "":String
有人知道问题是什么吗?
答案 0 :(得分:5)
您正在尝试的不仅仅是创建一个新功能。您正尝试将新方法添加到String
。
为此,您可以将函数within_range?
放入新模块中,然后将该模块包含在所需的类中。
通常,这是通过调用include
方法完成的,但由于您无法调用String.include
或更改String
或Integer
类的源代码,因此您必须作弊并使用send
方法。
String.send(:include, YourModule)
Integer.send(:include, YourModule)
这样,String
和Integer
类就会获得YourModule
中定义的所有方法。
有关更深入的信息,请尝试以下文章:Why Ruby’s Mixins Gives Rails an Advantage over Java Frameworks
答案 1 :(得分:4)
该函数不会以某种方式将自身添加到对象类中。我假设您要将其添加到Object
,因为您有is_a
来电。你必须重新打开它:
class Object
def within_range?(range)
if is_a?(String)
(range).include?(size)
elsif is_a?(Integer)
(range).include?(self)
end
end
end
答案 2 :(得分:4)
答案 3 :(得分:0)
我同意使用模块是最好的答案。或者,少用OO,用这种方式编写方法:
def within_range?(obj, range)
case obj
when String then range.include?(obj.size)
when Integer then range.include?(obj)
end
end
并称之为:
str = "string here"
puts "'#{str}' is within the range!" if within_range?(str, 3..30)
答案 4 :(得分:-1)
就像它提到的那样,它找不到String类的'within_range'方法。您需要将该方法添加到String类。
class String
def within_range?(range)
if self.is_a?(String)
(range).include?(self.size)
elsif self.is_a?(Integer)
(range).include?(self)
end
end
end