我尝试编写一个函数,它将在数组中找到与传递给函数的字符串匹配的项。见下面的代码。
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>
我如何为#获取“未定义的方法'文件管理器'
我不确定我做错了什么。
答案 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