Ruby 如果函数';它不存储在变量中吗?

Ruby 如果函数';它不存储在变量中吗?,ruby,Ruby,我正在调试一个如下所示的方法 def方法 如果有什么 “a” 艾尔希夫 “b” #如果。。。 其他的 “z” 结束 #当前返回值是??? 结束 ruby的工作方式给人的印象是,每个表达式都返回一个值,并且它被保存在某个地方。最后一个将在方法末尾返回(如果未找到return) 在上面的例子中,if条件返回一个字符串(存储在某处?),并且在方法的末尾,因为没有其他更改,所以返回该字符串 是否可以访问该值?(有点像控制台中的。,返回上一个命令的结果)[基于] 在Ruby中,控件表达式有一个返回值

我正在调试一个如下所示的方法

def方法
如果有什么
“a”
艾尔希夫
“b”
#如果。。。
其他的
“z”
结束
#当前返回值是???
结束

ruby的工作方式给人的印象是,每个表达式都返回一个值,并且它被保存在某个地方。最后一个将在方法末尾返回(如果未找到
return

在上面的例子中,if条件返回一个字符串(存储在某处?),并且在方法的末尾,因为没有其他更改,所以返回该字符串

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

[基于]


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

您的方法只返回结果。您可以通过以下方式进行检查:

def foo(b)
如果b
123
其他的
456
end.tap{| result | p result:result}
结束
傅(真)
#打印{:result=>123}
#=> 123
傅(假)
#打印{:result=>456}
#=> 456

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

C类
def foo(b)
如果是b,则返回123
456
结束
结束
您可以使用优化来替换该方法:

模块M
精炼C do
def foo(*)
super.tap{| result | p result:result}
结束
结束
结束
用法:

使用M
c=c新
c、 傅(真)
#打印{:result=>123}
#=> 123
c、 傅(假)
#打印{:result=>456}
#=> 456

另一种方法是使用钩子来执行:

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)
输出:

方法'foo'在第2行返回123
方法“foo”在第4行返回456

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

您可以使用
end.tap{v|puts v.inspect}
。它向块生成值并返回它。你说的“控制台”是什么意思?你指的是irb吗?或者您是否希望使用byebug/pry在某个地方设置断点,并检查前面的值?问这个问题的原因是因为所有这些工具都有自己的检查工具/命令。我不理解这个问题,但也许您正在寻找
x=if某物..end
x=method
。顺便问一下,这不是您的选项吗?如果不是的话,你可以看看Binding类“ruby的工作方式给人的印象是每个表达式都返回一个值,并保存在某个地方。”这在任何实际意义上都不是真的。Ruby将代码编译成字节码,字节码在内部堆栈上运行。返回值仅存在于堆栈上,除非将其分配给变量,否则无法访问它。谢谢!请把冒号修好,这样就完整了。我猜这意味着你不能访问存储的值,而只能访问最后一个方法(这就是为什么如果有返回值,它就不能工作,对吗?@estani在Ruby中没有保存最后一个表达式计算结果的特殊变量。但是您仍然可以将
点击
添加到方法的最后一个表达式并打印其结果。或者用打印返回值的方法临时替换该方法(参见第二个示例)@estani Ruby允许您通过
TracePoint
(参见第三个示例)钩住脚本执行,以便Ruby保存所有这些值<代码>tp。返回值正是我一直在寻找的!谢谢