Ruby 块的最佳解释? [关闭]

2023-11-24

您可以分享的对 Ruby 块的最佳解释是什么?

用法和编写代码都可以占用块吗?


我提供我自己的解释这个答案,稍作修改:

Ruby 中的“块”与一般编程术语“代码块”或“代码块”不同。

假设以下(无效)Ruby 代码实际上有效:

def add10( n )
  puts "#{n} + 10 = #{n+10}"
end

def do_something_with_digits( method )
  1.upto(9) do |i|
    method(i)
  end
end

do_something_with_digits( add10 )
#=> "1 + 10 = 11"
#=> "2 + 10 = 12"
...
#=> "9 + 10 = 19"

虽然该代码无效,但其意图(将一些代码传递给方法并让该方法运行该代码)在 Ruby 中可以通过多种方式实现。其中一种方法是“块”。

Ruby 中的块非常非常像方法:它可以接受一些参数并为这些参数运行代码。每当你看到foo{ |x,y,z| ... } or foo do |x,y,z| ... end,这些块采用三个参数并运行...在他们。(您甚至可能会看到upto上面的方法正在传递一个块。)

因为块是 Ruby 语法的特殊部分,所以允许每个方法传递一个块。不论方法与否uses块取决于方法。例如:

def say_hi( name )
  puts "Hi, #{name}!"
end

say_hi("Mom") do
  puts "YOU SUCK!"
end
#=> Hi, Mom!

上面的方法传递了一个准备发出侮辱的块,但由于该方法从不调用该块,因此只打印好消息。以下是我们如何从方法中调用块:

def say_hi( name )
  puts "Hi, #{name}!"
  if block_given?
    yield( name )
  end
end

say_hi("Mridang") do |str|
  puts "Your name has #{str.length} letters."
end
#=> Hi, Mridang!
#=> Your name has 7 letters.

We use block_given?查看一个块是否被传递。在本例中,我们将一个参数传递回块;由你的方法来决定将什么传递给块。例如:

def say_hi( name )
  puts "Hi, #{name}!"
  yield( name, name.reverse ) if block_given?
end

say_hi("Mridang"){ |str1, str2| puts "Is your name #{str1} or #{str2}?" }
#=> Hi, Mridang!
#=> Is your name Mridang or gnadirM?

这只是某些类将刚刚创建的实例传递到块的一种约定(也是一个很好的约定,也是您想要支持的约定)。

这不是一个详尽的答案,因为它没有涵盖捕获块作为参数、它们如何处理数量、块参数中的不扩散等,但旨在作为 Blocks-Are-Lambdas 的介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 块的最佳解释? [关闭] 的相关文章

随机推荐