gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:52 25 4
gpt4 key购买 nike

我无法理解 ruby​​ 中的 Blocks 与 Procs。我的基本想法是 proc 是一种保存为对象的方法,您可以重复调用该对象,而不必一遍又一遍地继续编写相同的代码行。

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

作业题 super 简单。

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

以下是他们正在寻找的答案。

def reverser(&prc)
sentence = prc.call
words = sentence.split(" ")
words.map { |word| word.reverse }.join(" ")
end

我有两个问题-

1 你怎么调用这个方法因为如果我把

print reverser("Hello") 

我收到错误“参数数量错误(给定 1,预期 0)”

其次,为什么不直接写下面的方法呢?编写采用 block 的方法有什么好处?

def reverser(string)
string.split.map{|x| x.reverse}.join(" ")
end

最佳答案

  1. 你可以这样调用它:

    print reverser { "Hello" }

或者如果你的 block 有几行那么长,那么像这样:

print reverser do
"Hello"
end
  1. block 接近于其他语言中的匿名函数。

map 就是一个很好的例子。map 的作用是获取一个数组并根据您需要的任何规则映射(转换)每个元素。

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

所以在你的例子中你有这个:

words.map { |word| word.reverse }.join(" ")

如果您不能将 block 传递给映射,那么您必须定义该函数并将其传递到某处 - 并为该函数命名。那就是效率不高。

让我们更改此 block 以使其仅在以大写字母开头时才反转单词。

words.map do |word| 
if word[0] =~ /[A-Z]/
word.reverse
else
word
end.join(" ")

如果没有 block ,您需要定义该函数,您在任何其他地方都不需要它并调用它。那是没有效率的。这是它的样子

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)

关于Ruby - 为什么使用 block 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com