Ruby 使用yield更改函数内的参数

Ruby 使用yield更改函数内的参数,ruby,Ruby,我不熟悉收益率的概念,目前正在实践它。 我本想得到[面包,多汁的,面包] 但是我有[面包,牛排,面包] 你能帮我理解为什么吗?我如何修复我的代码 def burger(patty) if block_given? yield(patty) end return ["bread", patty, "bread"] end # TODO: Change 'steak'to 'JUICY'using yield juicy_burger

我不熟悉收益率的概念,目前正在实践它。 我本想得到[面包,多汁的,面包] 但是我有[面包,牛排,面包]

你能帮我理解为什么吗?我如何修复我的代码

def burger(patty)
  if block_given?
    yield(patty)
  end
  return ["bread", patty, "bread"]
end


# TODO: Change 'steak'to 'JUICY'using yield
juicy_burger = burger("steak") do |patty|
  patty = "JUICY"
end
p juicy_burger
这样的重新分配不会传播到外部作用域。一旦该块返回,patty将恢复到其初始值

解决方案?在覆盖值仍在范围内时使用该值

def burger(patty)
  if block_given?
    patty = yield(patty)
    # ^ shadow the parameter here. 
    # doesn't have to be a shadow. You can use any name. new_patty = yield(patty)
  end
  return ["bread", patty, "bread"]
end


juicy_burger = burger("steak") do |patty|
  "JUICY #{patty}" # <- simple return here
end
p juicy_burger # >> ["bread", "JUICY steak", "bread"]

变量是函数的局部变量,您没有保存返回的值。下面的代码将为您提供[面包,多汁,面包]


就像sergio提到的,没有必要在块内赋值,因为这是一个很好的答案。只需补充一点,块参数“patty”没有使用或不需要,可以从方法调用和产量中省略。@SteveTurczyn:我的版本中使用了它,但你是对的。
def burger(patty)
  if block_given?
    patty = yield(patty)
    # ^ shadow the parameter here. 
    # doesn't have to be a shadow. You can use any name. new_patty = yield(patty)
  end
  return ["bread", patty, "bread"]
end


juicy_burger = burger("steak") do |patty|
  "JUICY #{patty}" # <- simple return here
end
p juicy_burger # >> ["bread", "JUICY steak", "bread"]
def burger(patty)
  if block_given?
    patty = yield(patty) # <-- this is the diff
  end
  return ["bread", patty, "bread"]
end


# TODO: Change 'steak'to 'JUICY'using yield
juicy_burger = burger("steak") do |patty|
  patty = "JUICY"
end
p juicy_burger