Ruby on rails 使用Ruby,我可以在返回方法中的返回变量之前访问它吗?

Ruby on rails 使用Ruby,我可以在返回方法中的返回变量之前访问它吗?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我正在开发一个Ruby应用程序,并使用puts和其他方式在方法中显示变量,以跟踪正在发生的事情。当然,这改变了方法的“返回”。是否有一个通用的Ruby变量允许我在终止该方法之前访问该方法中的当前返回变量?这样,我可以在puts中访问它,然后确保在终止之前再次设置它。我知道该方法的最后一个结果是向前传递的结果。我特别寻找一种访问该变量的通用方法,不管它是用什么方法调试的 我使用Rubymine作为我的IDE,我确实使用它进行调试。但是,关于REPL的一些东西,比如IRB,非常有趣。这可能是我的36

我正在开发一个Ruby应用程序,并使用puts和其他方式在方法中显示变量,以跟踪正在发生的事情。当然,这改变了方法的“返回”。是否有一个通用的Ruby变量允许我在终止该方法之前访问该方法中的当前返回变量?这样,我可以在puts中访问它,然后确保在终止之前再次设置它。我知道该方法的最后一个结果是向前传递的结果。我特别寻找一种访问该变量的通用方法,不管它是用什么方法调试的

我使用Rubymine作为我的IDE,我确实使用它进行调试。但是,关于REPL的一些东西,比如IRB,非常有趣。这可能是我的360汇编程序员,但我正在和自己约会。你们当中有多少人是在1969年开始编程的?哈哈


谢谢。

为什么简单的看跌期权不适合你

def foo
  bar = 1
  puts bar
  bar
end

为什么简单的看跌期权对你不起作用

def foo
  bar = 1
  puts bar
  bar
end

一个选项可能是
.tap
方法。假设你有

x = foo
并且想知道
foo
的返回值是多少:

x = foo.tap { |r| puts r.inspect }
put r.inspect
的其余部分都是编写的
pr
,这是相同内容的有效速记语法(顺便说一下,
p
返回其参数,因此在许多情况下,您可以在返回的变量前面粘贴一个
p
,除了一些语法细节)


或者,如果要检查
foo
的内部,并且定义如下:

def foo
  # Do stuff
  something_that_is_returned
end
您可以在不影响返回值的情况下,将
添加到最后一条语句中。点击

def foo
  # Do stuff
  something_that_is_returned.tap { |r| p r }
end
这是因为
.tap
将当前对象生成块,并返回原始对象,而不考虑块的返回值。在一长串方法中插入
。点击
,检查中间结果是非常有用的

你有

x = foo.map {|x| whatever}.select {|x| whatever}
并且想知道
select
在不重新编写大量代码的情况下接收到什么:

x = foo.map {|x| whatever}.tap { |r| p r }.select {|x| whatever}
如果您发现自己经常这样做,您可能希望为其定义一个全局方法:

def tapp
  tap do |o|
    p o
  end
end
要使用,只需将
.tapp
附加到表达式:

something_that_is_returned.tapp

一个选项可能是
.tap
方法。假设你有

x = foo
并且想知道
foo
的返回值是多少:

x = foo.tap { |r| puts r.inspect }
put r.inspect
的其余部分都是编写的
pr
,这是相同内容的有效速记语法(顺便说一下,
p
返回其参数,因此在许多情况下,您可以在返回的变量前面粘贴一个
p
,除了一些语法细节)


或者,如果要检查
foo
的内部,并且定义如下:

def foo
  # Do stuff
  something_that_is_returned
end
您可以在不影响返回值的情况下,将
添加到最后一条语句中。点击

def foo
  # Do stuff
  something_that_is_returned.tap { |r| p r }
end
这是因为
.tap
将当前对象生成块,并返回原始对象,而不考虑块的返回值。在一长串方法中插入
。点击
,检查中间结果是非常有用的

你有

x = foo.map {|x| whatever}.select {|x| whatever}
并且想知道
select
在不重新编写大量代码的情况下接收到什么:

x = foo.map {|x| whatever}.tap { |r| p r }.select {|x| whatever}
如果您发现自己经常这样做,您可能希望为其定义一个全局方法:

def tapp
  tap do |o|
    p o
  end
end
要使用,只需将
.tapp
附加到表达式:

something_that_is_returned.tapp

或者,如果您想更具表达力,可以定义一个方法

def puts_and_return(r)
    puts r
    r
end
然后使用

puts_and_return (last statement of method)

或者,如果您想更具表达力,可以定义一个方法

def puts_and_return(r)
    puts r
    r
end
然后使用

puts_and_return (last statement of method)

是的,行得通。然而,我的问题更一般化。我是否可以复制并粘贴一些东西来放置变量,然后在不考虑任何方法中的变量名的情况下再次设置它,而不考虑该方法使用的变量或设置方式?特别是,有些方法不会以任何方式终止于简单的直接赋值。是的,这是有效的。然而,我的问题更一般化。我是否可以复制并粘贴一些东西来放置变量,然后在不考虑任何方法中的变量名的情况下再次设置它,而不考虑该方法使用的变量或设置方式?特别是,有些方法不会以简单的直接赋值方式终止。为了让R|V清楚,要使用它,您只需“添加”
。在所有将被“返回”的语句末尾点击{R|p R}
,返回链将是不间断的,信息量非常大。我想我想知道水龙头和其他的有什么不同。我的意思是,map返回结果。每个都返回原始对象。那是tap做的吗?或者,tap是否更通用?@R\G:
。tap
非常相似。每个
,主要区别在于
。tap
始终运行块一次,传递原始对象(同时
。每个
当然会针对对象的内容多次运行块)
.tap
也可在常规基类
对象上使用,而
则可使用。每个
仅在容器类上可用。因此,
.tap
甚至可以在
nil
上使用,只是为了让R|V清楚,要使用它,您只需将
.tap{R|p R}
添加到所有将被“返回”的语句的末尾,返回链将是不间断的,非常有用。我想我想知道水龙头和其他的有什么不同。我的意思是,map返回结果。每个都返回原始对象。那是tap做的吗?或者,tap是否更通用?@R\G:
。tap
非常相似。每个
,主要区别在于
。tap
始终运行块一次,传递原始对象(同时
。每个
当然会多次运行块)