例如我有一个散列:第一个月我可以按如下所示修改散列:@something.each { |(k,v)| @something[k] = v*2 }
@something.each { |(k,v)| @something[k] = v*2 }
@something
这也可以通过使用reduce方法来解决,该方法完全避免了该问题,但增加了权重或转换为数组并使用map。或者只是个坏主意。
reduce
map
lmvvr0a81#
我将使用transform_values而不是each:
transform_values
each
@something = @something.transform_values{ |v| v * 2}
现在您根本不需要引用@something,因为您只是在创建一个新的散列。
jpfvwuh42#
也可以使用#each_with_object来构建新的散列。
#each_with_object
@something.each_with_object({}) { |(k, v), h| h[k] = v * 2 } # => {:a=>2, :b=>4, :c=>6}
wsxa1bj13#
虽然已经给出了更好的答案,但还有其他几种选择:使用merge!并将原始散列与其自身合并;
merge!
@something = {a: 1, b: 2, c: 3} @something.merge!(@something) {|k, v| v*2} @something #=> {:a=>2, :b=>4, :c=>6}
使用map;
@something = {a: 1, b: 2, c: 3} @something = @something.map{|k, v| [k, v*2]}.to_h @something #=> {:a=>2, :b=>4, :c=>6}
d7v8vwbk4#
有没有一种在括号中引用变量@something的简写方法?下面是一个狡猾的例子,使用instance_eval沿着一个嵌套块,这样你就可以简单地引用self:
instance_eval
self
@something = {a: 1, b: 2, c: 3} @something.instance_eval {each{|k, v| self[k] = v*2}} @something #=> {:a=>2, :b=>4, :c=>6}
4条答案
按热度按时间lmvvr0a81#
我将使用
transform_values
而不是each
:现在您根本不需要引用
@something
,因为您只是在创建一个新的散列。jpfvwuh42#
也可以使用
#each_with_object
来构建新的散列。wsxa1bj13#
虽然已经给出了更好的答案,但还有其他几种选择:
使用
merge!
并将原始散列与其自身合并;使用
map
;d7v8vwbk4#
有没有一种在括号中引用变量@something的简写方法?
下面是一个狡猾的例子,使用
instance_eval
沿着一个嵌套块,这样你就可以简单地引用self
: