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