Ruby on rails 政府有何建议?;你会在Ruby中的一个论点前做什么?
我正在做一些Ruby Koan练习。因为我是个新手,所以有些代码对我来说似乎没有意义。例如,参数前面的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 {
&
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`。由于该块调用是该方法中的最后一行,因此块的结果将返回。