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

标签 ruby

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

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/

相关文章:

ruby - 您如何使用 Factory Girl 引用工厂内的类(class)?

ruby - 如何在 Sequel 的 where 语句中使用 json 字段?

ruby - 关于 Ruby 单例类的一般问题

ruby-on-rails - PostsController 中的 ActiveModel::ForbiddenAttributesError#create

ruby - 如何使用 Nokogiri 和 Builder 不从父元素继承 namespace ?

ruby - DateTime.yesterday 返回今天的日期而不是昨天

ruby-on-rails - #<Array : 的未定义方法 `with_indifferent_access'

Ruby:如何在不创建新实例的情况下检查实例方法的参数?

ruby - 确保类的单个实例的正确方法是什么?

ruby-on-rails - Devise 的经过身份验证和未经身份验证的路由