Ruby: reuse value in a block without assigning it to variable (write object method on the fly)

∥☆過路亽.° 提交于 2019-12-25 11:25:11

问题


There are several situations where I'd like to apply a block to a certain value and use the value inside this block, to use the enumerator coding style to every element.

If such method would be called decompose, it would look like:

result = [3, 4, 7, 8].decompose{ |array| array[2] + array[3] } # result = 15

# OR

result = {:key1 => 'value', :key2 => true}.decompose{ |hash| hash[:key1] if hash[:key2] } # result = 'value'

# OR

[min, max] = [3, 4, 7, 8].decompose{ |array| [array.min, array.max] } # [min, max] = [3, 8]

#  OR

result = 100.decompose{ |int| (int - 1) * (int + 1) / (int * int) } # result = 1

# OR

result = 'Paris'.decompose{ |str| str.replace('a', '') + str[0] } # result = 'PrisP'

回答1:


The method simply yields self to the block, returning the block's result. I don't think it exists, but you can implement it yourself:

class Object
  def decompose
    yield self
  end
end

[3, 4, 7, 8].decompose{ |array| array[2] + array[3] }
#=> 15

{:key1 => 'value', :key2 => true}.decompose{ |hash| hash[:key1] if hash[:key2] }
#=> "value"

[3, 4, 7, 8].decompose{ |array| [array.min, array.max] }
#=> [3, 8]



回答2:


It actually exists (I could not believe it didn't).

It is called BasicObject#instance_eval. Here's the doc: http://apidock.com/ruby/BasicObject/instance_eval

Available since Ruby 1.9 as this post explains: What's the difference between Object and BasicObject in Ruby?



来源:https://stackoverflow.com/questions/26378890/ruby-reuse-value-in-a-block-without-assigning-it-to-variable-write-object-meth

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!