发布此问题后,我尝试重新阅读代码并尝试使用 irb 中的一些示例,以下是回答我问题的发现。
在 Ruby 中,任何方法都可以使用一段代码。例如。
def method_can_take_block?
answer = 'yes it can take block of code'
end
method_can_take_block? { puts 'this code is not executed but gets passed to method' }
要让我的代码块执行,它需要在方法内部产生。只需在方法内调用yield 即可生成代码块。通过显式调用yield,我们可以控制执行代码块的行。
def method_can_take_block?
answer = 'yes it can take block of code'
yield
end
method_can_take_block? { puts 'this code gets executed after the variable 'answer' gets assigned with some value.' }
但是,我们在这里没有使用变量“answer”。传递的代码块对函数内部定义的变量没有任何访问权限。因此,为了让块能够访问方法内定义的变量,我们需要让块接受一些参数。注意 |my_answer| 的使用在下面的代码块中。
method_can_take_block? { |my_answer| 100.times { puts answer } }
现在我们已经为块添加了一个参数到块中,我们需要在调用代码块时传递这个参数。因此,这是通过使用附加参数调用 yield 来完成的。
def method_can_take_block?
answer = 'yes it can take block of code'
yield answer
end
yield answer 将答案变量传递给传递给方法的代码块。在这种情况下,answer 在块内作为 my_answer 变量传递,然后打印 100 次。
有了这样的理解,我的问题的回答
代码块如何获得分配的变量状态
回答:通过yield presenter 行。这里presenter 变量被传递给以名称status 接收参数的块。
为什么我们需要在辅助函数中使用'if'语句,为什么不直接返回presenter变量呢?
我们可以避免将整个 erb 作为块传递给方法,但是我们需要在 show.html.erb 的顶部有这样的代码:
<% status = designer_status_for(@designer) %> 然后开始使用变量status。我认为使用块是美学问题,这样我们就可以避免使用赋值。该方法中的 if 语句可以使用这种语法而不是使用块。