Ruby Koans:块和参数 (test_blocks_can_take_arguments)
Ruby Koans: blocks and arguments (test_blocks_can_take_arguments)
Ruby Koans 在 about_blocks.rb 中有以下练习:
def method_with_block_arguments
yield("Jim")
end
def test_blocks_can_take_arguments
method_with_block_arguments do |argument|
assert_equal __, argument
end
end
我知道答案是 assert_equal "Jim",参数 ,但我很难理解发生了什么。具体来说:
- 是
argument
还是assert_equal...
块?
- 如果 method_with_block_arguments returns "Jim" 没有
yield
,yield
在做什么?
我认为上面的某些评论者说您目前对 Ruby 没有很深入的了解是正确的,但不要因此而气馁。只是需要时间来学习。当我第一次学习 Ruby 时,块的概念及其语法确实花了我一些时间来理解。一旦你掌握了它,语法就非常简单,但是直到你达到那个点......
任何人,这是我试图帮助你。 :)
argument
是一个 块变量 。 do
和 end
之间的所有东西都是块。 assert_equal
只是一个普通的方法调用,与块无关。
yield
所做的是理解块如何工作的关键。 yield
的作用是 "yields" 控制调用函数。您可以将其视为回调。当你在函数中间说 "yield" 时,你实际上是在说 "in the middle of this function, I want to allow someone else to plug in their code and make decisions about what should happen." 如果你使用 yield
没有参数,你的数据就没有了方法被传递回调用者。
本质上,yield
是一种 "yielding" 控制他人的方式,在本例中是您函数的调用者。
当您使用一个或多个参数调用 yield
时,您将数据从您的函数传回给调用者。因此,当您说 yield("Jim")
时,您会将字符串 "Jim"
交还给调用 method_with_block_arguments
的任何人。
最后,您必须了解,在 Ruby 中,方法总是 return 特定方法中最后一个表达式的结果。这就是为什么您通常不需要明确的 return
语句。
例如,此方法将 return 42
.
def foo
42
end
那是因为 42
是 Ruby 中的有效表达式。它只是一个标识,但它是有效的 Ruby,所以 Ruby 只是说 "okay, you said 42 and that's the last thing in this method declaration. So when people call 'foo' they get 42 back".
希望对您有所帮助。我认为此时你应该假设你在 Ruby 学习方面还处于早期阶段,但你在正确的轨道上调查障碍。一旦你得到它们,你就会理解 Ruby.
最强大的部分之一
- Is argument or assert_equal... the block?
不,参数和 assert_equal 都不是块,argument
是变量,do
和 end
之间的任何东西都是块。 assert_equal
是一个普通的方法调用。
- What is yield doing given that method_with_block_arguments returns "Jim" without yield?
产量使其与众不同。它调用块(即 do
和 end
之间的所有内容)并执行它。 "Jim" 是块的参数。
这是我在学习时从 Paul 那里复制的要点 ruby。这应该有助于了解 ruby 中的闭包。
Ruby Koans 在 about_blocks.rb 中有以下练习:
def method_with_block_arguments
yield("Jim")
end
def test_blocks_can_take_arguments
method_with_block_arguments do |argument|
assert_equal __, argument
end
end
我知道答案是 assert_equal "Jim",参数 ,但我很难理解发生了什么。具体来说:
- 是
argument
还是assert_equal...
块? - 如果 method_with_block_arguments returns "Jim" 没有
yield
,yield
在做什么?
我认为上面的某些评论者说您目前对 Ruby 没有很深入的了解是正确的,但不要因此而气馁。只是需要时间来学习。当我第一次学习 Ruby 时,块的概念及其语法确实花了我一些时间来理解。一旦你掌握了它,语法就非常简单,但是直到你达到那个点......
任何人,这是我试图帮助你。 :)
argument
是一个 块变量 。 do
和 end
之间的所有东西都是块。 assert_equal
只是一个普通的方法调用,与块无关。
yield
所做的是理解块如何工作的关键。 yield
的作用是 "yields" 控制调用函数。您可以将其视为回调。当你在函数中间说 "yield" 时,你实际上是在说 "in the middle of this function, I want to allow someone else to plug in their code and make decisions about what should happen." 如果你使用 yield
没有参数,你的数据就没有了方法被传递回调用者。
本质上,yield
是一种 "yielding" 控制他人的方式,在本例中是您函数的调用者。
当您使用一个或多个参数调用 yield
时,您将数据从您的函数传回给调用者。因此,当您说 yield("Jim")
时,您会将字符串 "Jim"
交还给调用 method_with_block_arguments
的任何人。
最后,您必须了解,在 Ruby 中,方法总是 return 特定方法中最后一个表达式的结果。这就是为什么您通常不需要明确的 return
语句。
例如,此方法将 return 42
.
def foo
42
end
那是因为 42
是 Ruby 中的有效表达式。它只是一个标识,但它是有效的 Ruby,所以 Ruby 只是说 "okay, you said 42 and that's the last thing in this method declaration. So when people call 'foo' they get 42 back".
希望对您有所帮助。我认为此时你应该假设你在 Ruby 学习方面还处于早期阶段,但你在正确的轨道上调查障碍。一旦你得到它们,你就会理解 Ruby.
最强大的部分之一
- Is argument or assert_equal... the block?
不,参数和 assert_equal 都不是块,argument
是变量,do
和 end
之间的任何东西都是块。 assert_equal
是一个普通的方法调用。
- What is yield doing given that method_with_block_arguments returns "Jim" without yield?
产量使其与众不同。它调用块(即 do
和 end
之间的所有内容)并执行它。 "Jim" 是块的参数。
这是我在学习时从 Paul 那里复制的要点 ruby。这应该有助于了解 ruby 中的闭包。