Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 与常规方法相比,使用块可以获得什么好处?_Ruby - Fatal编程技术网

Ruby 与常规方法相比,使用块可以获得什么好处?

Ruby 与常规方法相比,使用块可以获得什么好处?,ruby,Ruby,我是一名Java程序员,我正在学习Ruby 但我不明白那些代码块能给我什么好处。。。比如,传递一个块作为参数的目的是什么?为什么没有两个可以重用的专门方法呢 为什么块中的某些代码不能重用 我会喜欢一些代码示例 谢谢你的帮助 块背后的思想是,它是一个高度本地化的代码,在调用站点有定义非常有用。可以将现有函数用作块参数。只需将其作为附加参数传递,并在其前面加一个&就可以考虑在Java中使用匿名类的一些事情。e、 它们通常用于事件监听器等可插拔行为,或用于参数化具有一般布局的方法 假设我们要编写一个方

我是一名Java程序员,我正在学习Ruby

但我不明白那些代码块能给我什么好处。。。比如,传递一个块作为参数的目的是什么?为什么没有两个可以重用的专门方法呢

为什么块中的某些代码不能重用

我会喜欢一些代码示例


谢谢你的帮助

块背后的思想是,它是一个高度本地化的代码,在调用站点有定义非常有用。可以将现有函数用作块参数。只需将其作为附加参数传递,并在其前面加一个&

就可以考虑在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中的块是闭包,可以轻松访问在相同范围内定义的局部变量,而无需显式地将它们传递给某个方法。