Ruby 与常规方法相比,使用块可以获得什么好处?
我是一名Java程序员,我正在学习Ruby 但我不明白那些代码块能给我什么好处。。。比如,传递一个块作为参数的目的是什么?为什么没有两个可以重用的专门方法呢 为什么块中的某些代码不能重用 我会喜欢一些代码示例Ruby 与常规方法相比,使用块可以获得什么好处?,ruby,Ruby,我是一名Java程序员,我正在学习Ruby 但我不明白那些代码块能给我什么好处。。。比如,传递一个块作为参数的目的是什么?为什么没有两个可以重用的专门方法呢 为什么块中的某些代码不能重用 我会喜欢一些代码示例 谢谢你的帮助 块背后的思想是,它是一个高度本地化的代码,在调用站点有定义非常有用。可以将现有函数用作块参数。只需将其作为附加参数传递,并在其前面加一个&就可以考虑在Java中使用匿名类的一些事情。e、 它们通常用于事件监听器等可插拔行为,或用于参数化具有一般布局的方法 假设我们要编写一个方
谢谢你的帮助 块背后的思想是,它是一个高度本地化的代码,在调用站点有定义非常有用。可以将现有函数用作块参数。只需将其作为附加参数传递,并在其前面加一个&就可以考虑在Java中使用匿名类的一些事情。e、 它们通常用于事件监听器等可插拔行为,或用于参数化具有一般布局的方法 假设我们要编写一个方法,该方法接受一个列表并返回一个新列表,其中包含给定列表中指定条件为true的项。在Java中,我们将编写一个接口:
interface Condition {
boolean f(Object o);
}
然后我们可以写:
public List select(List list, Condition c) {
List result = new ArrayList();
for (Object item : list) {
if (c.f(item)) {
result.add(item);
}
}
return result;
}
List even = select(mylist, new Condition() {
public boolean f(Object o) {
return ((Integer) o) % 2 == 0;
}
});
如果我们想从列表中选择偶数,我们可以写:
public List select(List list, Condition c) {
List result = new ArrayList();
for (Object item : list) {
if (c.f(item)) {
result.add(item);
}
}
return result;
}
List even = select(mylist, new Condition() {
public boolean f(Object o) {
return ((Integer) o) % 2 == 0;
}
});
要在Ruby中编写等效代码,可以是:
def select(list)
new_list = []
# note: I'm avoid using 'each' so as to not illustrate blocks
# using a method that needs a block
for item in list
# yield calls the block with the given parameters
new_list << item if yield(item)
end
return new_list
end
当然,这个功能已经内置到Ruby中,所以在实践中您只需要这样做
even = list.select { |i| i % 2 == 0 }
作为另一个示例,考虑代码打开文件。你可以做:
f = open(somefile)
# work with the file
f.close
但是,您需要考虑将关闭放在一个确保块中,以防在处理文件时发生异常。相反,你可以这样做
open(somefile) do |f|
# work with the file here
# ruby will close it for us when the block terminates
end
哼谢谢,这是一个很好的例子。。。我想我需要一些时间来适应这样的想法。但是这就是为什么我要学习ruby:D,当你得到它的时候,它是一个很好的解决方案。看看-很多使用块的方法的好例子。我认为习惯块是一个由两部分组成的过程:1开始理解使用块的一些标准方法2开始思考你自己编写的方法如何利用接受块。我还为上面的答案添加了一个示例。除了下面的答案之外,请注意Ruby中的块是闭包,可以轻松访问在相同范围内定义的局部变量,而无需显式地将它们传递给某个方法。