Ruby-为什么使用块作为参数?

Ruby-为什么使用块作为参数?,ruby,block,proc,Ruby,Block,Proc,我很难理解ruby中的块与过程。我的基本想法是,proc是一种保存为对象的方法,您可以重复调用它,而不必反复编写相同的代码行 我的问题在于在方法中接受块作为参数 家庭作业问题非常简单 编写一个方法,该方法接受一个块作为参数,并反转字符串中的所有单词 下面是他们正在寻找的答案 def reverser(&prc) sentence = prc.call words = sentence.split(" ") words.map { |word| word.reverse }.j

我很难理解ruby中的块与过程。我的基本想法是,proc是一种保存为对象的方法,您可以重复调用它,而不必反复编写相同的代码行

我的问题在于在方法中接受块作为参数


家庭作业问题非常简单

编写一个方法,该方法接受一个块作为参数,并反转字符串中的所有单词

下面是他们正在寻找的答案

def reverser(&prc)
  sentence = prc.call
  words = sentence.split(" ")
  words.map { |word| word.reverse }.join(" ")
end
我有两个问题-

1你怎么称呼这个方法,因为如果我把

print reverser("Hello") 
我收到一个错误“参数数量错误(给定1,应为0)”

其次,为什么不写下面的方法呢?编写占用块的方法有什么好处?

def reverser(string)
  string.split.map{|x| x.reverse}.join(" ")
end 
  • 你可以这样称呼它:

    print reverser { "Hello" }
    
  • 或者,如果块有几行长,则如下所示:

    print reverser do
      "Hello"
    end
    
  • 块接近于其他语言中的匿名函数
  • Map就是一个很好的例子。 映射所做的是获取一个数组,并根据您需要的任何规则映射(转换)每个元素

    这些映射规则必须是代码。这意味着,它不能是字符串、数字或其他东西,它必须是一个函数。块在这里用作函数,您可以使用最少的代码编写它

    因此,在您的示例中,您有:

    words.map { |word| word.reverse }.join(" ")
    
    若不能将块传递给map,那个么就必须定义该函数并将其传递到某个地方,然后命名该函数。这是没有效率的

    让我们将此块更改为有效,以便它仅在以大写字母开头时反转单词

    words.map do |word| 
      if word[0] =~ /[A-Z]/ 
        word.reverse
      else
        word
    end.join(" ")
    
    如果没有块,您需要定义该函数,而在任何其他地方都不需要该函数并调用它。那就是没有效率。 这就是它的样子

    def reverse_if_starts_with_capital_letter(word)
      if word[0] =~ /[A-Z]/ 
        word.reverse
      else
        word
      end
    end
    
    # not sure if this syntax would work, just demonstrates idea
    words.map(&reverse_if_starts_with_capital_letter)
    

    “如何调用此方法”:
    reverser{“Hello”}
    “家庭作业问题非常简单。”–家庭作业问题非常愚蠢,因为它根本无法证明块的有用性。@JörgWMittag你有一个有用的好例子吗?任何帮助都将不胜感激,因为在过去的6个月里,我一直在自学。事实上,您在
    reverser
    的实现中已经使用了一个块,而
    可枚举的
    方法(大多数都使用了一个块)都是很好的例子。这让我大吃一惊。我已经被困了两天,试图了解发生了什么,这让我更好地理解了这个概念。