Ruby on rails 政府有何建议?;你会在Ruby中的一个论点前做什么?

Ruby on rails 政府有何建议?;你会在Ruby中的一个论点前做什么?,ruby-on-rails,ruby,variables,arguments,Ruby On Rails,Ruby,Variables,Arguments,我正在做一些Ruby Koan练习。因为我是个新手,所以有些代码对我来说似乎没有意义。例如,参数前面的& def method_with_explicit_block(&block) block.call(10) end def test_methods_can_take_an_explicit_block_argument assert_equal 20, method_with_explicit_block { |n| n * 2 } add_one = lambda {

我正在做一些Ruby Koan练习。因为我是个新手,所以有些代码对我来说似乎没有意义。例如,参数前面的
&

def method_with_explicit_block(&block)
    block.call(10)
end

def test_methods_can_take_an_explicit_block_argument
assert_equal 20, method_with_explicit_block { |n| n * 2 }

add_one = lambda { |n| n + 1 }
assert_equal 11, method_with_explicit_block(&add_one)
end
为什么在
添加一个之前有一个
&
?使其成为全局变量或引用上一个变量

谢谢大家!

在方法定义中的一个参数前面,一元前缀与
&
符号表示:将传递到此方法的块打包为适当的
Proc
对象

在方法调用中的参数前面,一元前缀和
&
运算符意味着:将作为参数传递的对象转换为
Proc
,方法是将消息
发送到_Proc
(除非它已经是
Proc
)并将其“展开”为块,即,将
Proc
视为直接作为块传递。

在方法定义中的参数前面,一元前缀与
&
符号表示:将传递到此方法的块打包为适当的
Proc
对象


在方法调用中的参数前面,一元前缀和
&
运算符意味着:将作为参数传递的对象转换为
Proc
,方法是将消息
发送到_Proc
(除非它已经是
Proc
)并将其“展开”为块,也就是说,将
Proc
视为直接作为块传递。

Proc的示例

multiples_of_3 = Proc.new do |n|
  n%3 == 0
end

(1..100).to_a.select(&multiples_of_3)
此处的“&”用于将proc转换为块

另一个例子 这是如何将对块的引用(而不是局部变量)传递给方法的。Ruby允许您将任何对象像块一样传递给方法。如果传入的对象已经是块,则该方法将尝试使用该对象,但如果该对象不是块,则该方法将对其调用_proc,以尝试将其转换为块

还要注意的是,块部分(不带符号)只是一个参考名称,如果对您更有意义,您可以使用任何您喜欢的名称

def my_method(&block)
  puts block
  block.call
end

my_method { puts "Hello!" }
#<Proc:0x0000010124e5a8@tmp/example.rb:6>
Hello!  
def my_方法(&block)
放置块
阻塞呼叫
终止
我的方法{放“你好!”}
#
你好

正如您在上面的示例中所看到的,my_方法中的block变量是对块的引用,可以使用call方法执行。对块的调用与使用yield是一样的,有些人喜欢使用block.call而不是yield来提高可读性。

procs的示例

multiples_of_3 = Proc.new do |n|
  n%3 == 0
end

(1..100).to_a.select(&multiples_of_3)
此处的“&”用于将proc转换为块

另一个例子 这是如何将对块的引用(而不是局部变量)传递给方法的。Ruby允许您将任何对象像块一样传递给方法。如果传入的对象已经是块,则该方法将尝试使用该对象,但如果该对象不是块,则该方法将对其调用_proc,以尝试将其转换为块

还要注意的是,块部分(不带符号)只是一个参考名称,如果对您更有意义,您可以使用任何您喜欢的名称

def my_method(&block)
  puts block
  block.call
end

my_method { puts "Hello!" }
#<Proc:0x0000010124e5a8@tmp/example.rb:6>
Hello!  
def my_方法(&block)
放置块
阻塞呼叫
终止
我的方法{放“你好!”}
#
你好

正如您在上面的示例中所看到的,my_方法中的block变量是对块的引用,可以使用call方法执行。对块的调用与使用yield是一样的,有些人喜欢使用block.call而不是yield来提高可读性。

基本上是将一块代码作为参数传入,当在方法中使用
call
时,就是调用该块并在那里使用它。因此,您可以看到
method_与_explicit_block({| n | n*2})
,您正在调用此方法,并传递该块参数。在带有显式块的方法
method\u中,您可以看到它被称为
block.call(10)
,并且
10
的参数被传递给块。在块`{n | n*2}
中,在这种情况下,
n=10`。由于该块调用是该方法中的最后一行,因此块的结果将返回。基本上,您将一块代码作为参数传入,当在方法中使用
call
时,您将调用该块并在那里使用它。因此,您可以看到
method_与_explicit_block({| n | n*2})
,您正在调用此方法,并传递该块参数。在带有显式块的方法
method\u中,您可以看到它被称为
block.call(10)
,并且
10
的参数被传递给块。在块`{n | n*2}
中,在这种情况下,
n=10`。由于该块调用是该方法中的最后一行,因此块的结果将返回。