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

半长

我无法理解 ruby​​ 中的 Blocks 与 Procs。我的基本想法是,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 
马尔科·阿夫利亚斯
  1. 你会这样称呼它:

    print reverser { "Hello" }
    

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

print reverser do
  "Hello"
end
  1. 块类似于其他语言中的匿名函数。

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

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

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

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

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

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

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么回复_?需要符号作为Ruby中的参数?

来自分类Dev

为什么带有splat参数的Ruby proc / block的行为与方法和lambda的行为不同?

来自分类Dev

使用参数ruby作为哈希键

来自分类Dev

为什么将方法作为参数(&block)传递不起作用?

来自分类Dev

为什么某些方法在Ruby中仅接受块作为参数?

来自分类Dev

使用 rspec 传递 ruby &block

来自分类Dev

Ruby hash.dig使用数组作为参数?

来自分类Dev

在 ruby 方法中使用全局变量作为参数

来自分类Dev

Ruby通过方法(?)作为参数?

来自分类Dev

Ruby块的结果作为参数

来自分类Dev

尝试从ruby_block使用RemoteFile

来自分类Dev

使用instance_eval的Ruby Block Scope

来自分类Dev

Ruby:使用block迭代方法的结果

来自分类Dev

尝试从ruby_block使用RemoteFile

来自分类Dev

使用函数作为函数的参数:为什么使用匿名函数?

来自分类Dev

带有可选选项和&block参数的Ruby方法

来自分类Dev

Chef:将参数传递给Chef中的ruby_block

来自分类Dev

为什么我不能使用std:cin作为参数

来自分类Dev

jQuery:为什么使用匿名函数作为参数?

来自分类Dev

为什么 continueWith 使用 action(of task) 作为参数?

来自分类Dev

在模板方法参数中使用Ruby常量作为默认值?

来自分类Dev

如何将&:key作为参数传递给map而不是使用ruby的块?

来自分类Dev

为什么需要el作为视图参数

来自分类Dev

为什么configure会将变量作为参数?

来自分类Dev

jQuery为什么接受数组作为参数?

来自分类Dev

** args作为Ruby中的函数参数

来自分类Dev

在Ruby中将类作为参数传递

来自分类Dev

Ruby-将函数作为参数传递

来自分类Dev

Ruby数组eval作为方法的参数

Related 相关文章

热门标签

归档