【问题标题】:Nested blocks and ERB嵌套块和 ERB
【发布时间】:2015-02-19 10:59:18
【问题描述】:

对于我的一生,我无法弄清楚为什么这不能按预期工作。

代码:

require 'erb'

def say_hello(name)
  "Nice to see you, #{ name }!"
end

def greetings
  template = <<-TEMPLATE
Hello!
<%= yield %>
Goodbye!
  TEMPLATE
  ERB.new(template).result(binding)
end

people = ['Aaron', 'Bob', 'Tim', 'Juan']
t = greetings do
  people.each do |p|
    say_hello(p)
  end
end

puts t

(有点做作,我知道,但它会起到作用。)

我的期望:

Hello!
Nice to see you, Aaron!
Nice to see you, Bob!
Nice to see you, Tim!
Nice to see you, Juan!
Goodbye!

我得到了什么:

Hello!
['Aaron', 'Bob', 'Tim', 'Juan']
Goodbye!

想法:

我猜这是因为内部块(以people.each 开头)在块执行之前被强制转换为字符串。也许 ERB 不喜欢我尝试将新的构造文本块注入其模板的方式。

这是怎么回事?

【问题讨论】:

    标签: ruby block erb yield


    【解决方案1】:

    each的返回值是数组本身,而不是块的返回值:

    people.each do |p|
      say_hello(p)
    end
    # => ['Aaron', 'Bob', 'Tim', 'Juan']
    

    你应该使用map,它从块中返回返回值的数组:

    people.map do |p|
      say_hello(p)
    end
    # => ["Nice to see you, Aaron!", "Nice to see you, Bob!", "Nice to see you, Tim!", "Nice to see you, Juan!"]
    

    您还需要连接数组以正确呈现它:

    t = greetings do
      people.map do |p|
        say_hello(p)
      end.join("\n")
    end
    

    【讨论】:

    • The return value of each is the array itself, not the return value of the block: - 这是我缺少的链接。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多