在ruby中创建一个函数

时间:2010-04-20 14:10:23

标签: ruby-on-rails ruby function

我在为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

有人知道问题是什么吗?

5 个答案:

答案 0 :(得分:5)

您正在尝试的不仅仅是创建一个新功能。您正尝试将新方法添加到String

为此,您可以将函数within_range?放入新模块中,然后将该模块包含在所需的类中。

通常,这是通过调用include方法完成的,但由于您无法调用String.include或更改StringInteger类的源代码,因此您必须作弊并使用send方法。

String.send(:include, YourModule)
Integer.send(:include, YourModule)

这样,StringInteger类就会获得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