发布此问题后,我尝试重新阅读代码并在 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.' }
但是,我们在这里没有使用变量“答案”。传递的代码块对函数内部定义的变量没有任何访问权限。因此,为了让块能够访问方法内定义的变量,我们需要让块接受一些参数。注意 |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
变量被传递给接收 name 参数的块status
。
为什么我们需要在辅助函数中使用'if'语句,为什么不直接返回presenter变量?我们可以避免将整个 erb 作为块传递给方法,但是我们需要在 show.html.erb 的顶部有这样的代码:
<% status = designer_status_for(@designer) %>
然后开始使用变量状态。我认为使用块是美学问题,这样我们就可以避免使用赋值。该方法中的 if 语句可以使用这种语法而不是使用块。