gpt4 book ai didi

ruby - 如果函数未存储在变量中,是否可以获取将从函数返回的值?

转载 作者:行者123 更新时间:2023-12-04 10:59:16 27 4
gpt4 key购买 nike

我正在调试一个看起来像这样的方法

def method
if something
"a"
elsif somethingelse
"b"
#elseif ...
else
"z"
end
# the current return value is ???
end

ruby 的工作方式给人的印象是每个表达式都返回一个值 它保存在某处。最后一个将在方法结束时返回(如果没有找到 return)。

在上面的例子中,if 条件返回一个字符串(它存储在某个地方?)并且在方法的末尾,因为没有其他任何改变,该字符串被返回。

是否可以访问该值? (有点像控制台中的 _,它返回最后一个命令的结果)

最佳答案

[基于 Aleksei Matiushkin's comment ]

在 Ruby 中,控制表达式有一个返回值。

您的方法仅返回 if expression 的结果。你可以通过 tap 来检查它:

def foo(b)
if b
123
else
456
end.tap { |result| p result: result }
end

foo(true)
# prints {:result=>123}
#=> 123

foo(false)
# prints {:result=>456}
#=> 456

如果您有更复杂的情况而没有一个最后的表达式,例如:

class C
def foo(b)
return 123 if b
456
end
end

您可以使用改进来替换该方法:

module M
refine C do
def foo(*)
super.tap { |result| p result: result }
end
end
end

用法:

using M

c = C.new

c.foo(true)
# prints {:result=>123}
#=> 123

c.foo(false)
# prints {:result=>456}
#=> 456

另一种方法是使用 TracePoint 来 Hook 执行:
def foo(b)             # 1
return 123 if b # 2
456 # 3
end # 4

TracePoint.trace(:return) do |tp|
puts "method `#{tp.method_id}' returned #{tp.return_value.inspect} on line ##{tp.lineno}"
end

foo(true)
foo(false)

输出:

method `foo' returned 123 on line #2
method `foo' returned 456 on line #4

请注意,这会打印所有方法调用的返回值。您可能希望将其限制为 tp.method_id == :foo

关于ruby - 如果函数未存储在变量中,是否可以获取将从函数返回的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58937856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com