Ruby错误 - 未定义的方法

时间:2017-02-22 05:01:44

标签: ruby-on-rails ruby windows web

我尝试编写一个函数,它将在数组中找到与传递给函数的字符串匹配的项。见下面的代码。

class Island 
  def filter(string) 
    for element in self
      if element.include? (string)
        yield(element)
      end
    end
  end 
end
list =    ["sasha","rory","rob","anthony","andre","tariq","kimberly","antoinette"]
list.filter("an"){|i| puts i}</i>

我如何为#获取“未定义的方法'文件管理器'

我不确定我做错了什么。

2 个答案:

答案 0 :(得分:2)

首先让我反对@Sravan发布的解决方案:

虽然确实 - 有时甚至是一个很好的解决方案 - 对一个班级进行修补,但你必须小心如何去做,因为它可能会成为定时炸弹:

Ruby发展,新版本经常向现有类添加方法。这意味着如果你添加一个方法Array#search,并且新版本的Ruby也会添加一个同名的方法,你的新方法将默认覆盖Ruby中的方法。你可能很久没有注意到它,直到你使用了一个应该使用Rubys Array#search的功能 - 可能是通过在stdlib中使用新的东西 - 你会得到奇怪的结果。追踪这种类型的错误可能是一场噩梦。当您使用 search 作为方法名称时就是这种情况。

现在,怎么做呢?三种可能性:

(1)如果你使用猴子补丁,至少使用一个不太可能成为官方界面一部分的方法名称。它可能将您的项目名称作为前缀或大量下划线字符,依此类推。请注意,这不是100%万无一失:Ruby的后续版本可能会添加一个私有方法,其名称与您选择的名称完全相同,但当然,您的姓名越多,发生的可能性就越小。< / p>

(2)如果你不喜欢这种使用&#34;笨拙&#34;名称,您至少可以在定义新方法之前进行测试,是否已经存在,如果不存在则抛出异常:

class Array
  if self.method_defined?(:search)
    raise "#{self.class}::search already defined"
  else
    def search(...)
     ...
    end
  end
end

(3)第三种可能性是避免猴子修补并将方法保留在你的岛级。在这种情况下,方法定义会有所不同:

class Island
  def self.filter(array, string)
    ...
  end
end

将由

调用
Island.filter(myarray, mystring)

更新:忘记了第四种可能性:

(4)你可以使Island成为Array的子​​类。我不知道你还想对你的岛屿做些什么,但也许这是一个值得考虑的选择:

class Island < Array
  def filter(string)
    ...
  end
end

当然,在调用过滤器时,您需要先将数组转换为孤岛,然后再使用它:

list = Island.new([....])

答案 1 :(得分:1)

关注ruby的convention over configuration,您可以添加/覆盖任何类中的任何方法

因此,向数组类添加函数使其可供所有数组访问。所以,在这个解决方案中。

1)首先,您已经在岛类中使用了 filter 功能,而是需要进入 {{1} } class ,因为列表是一个数组。

Array

2)由于过滤器关键字,如其他答案所示,请为其添加其他名称。例如: class Array def filter(string) for element in self if element.include? (string) yield(element) end end end end list = ["sasha","rory","rob","anthony","andre","tariq","kimberly","antoinette"] list.filter("an"){|i| puts i} O/P: anthony andre antoinette

search