如何将以下内联代码重写为块?

时间:2018-04-12 06:14:38

标签: ruby-on-rails ruby

我有这段代码:

.tap { |m| el(m, 3, 4) { |l, f| puts "Patient: #{l}, #{f}" } }

我需要将值lf分配给变量,然后将其保存到数据库中。

我尝试过这样的事情:

.tap { 
  m.each do
    puts m.inspect
  end
}

但这会导致语法错误。

在这种情况下,如何为变量赋值?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以将值分配给外部范围中定义的变量,例如:

str = nil
'foo'.tap { |s| str = s }
str #=> "foo"

或使用对象来保存值:

values = {}
'foo'.tap { |s| values[:str] = s }
values #=> {:str=>"foo"}

答案 1 :(得分:0)

虽然您可以直接从外部范围设置变量,但它违反了我所知道的所有良好实践。我会使用专用对象来存储值:

▶ class Test
▷   attr_accessor :foo, :bar
▷   def set(foobar)  
▷     @foo, @bar = foobar    
▷   end  
▷ end  
▶ test = Test.new; [42, 3.14].tap(&test.method(:set))
#⇒ [42, 3.14]
▶ test
#⇒ #<Test:0x0055aac1e0b2f0 @bar=3.14, @foo=42>