ruby 当对散列调用每个函数时,是否有一种方法可以以简化的方式引用块内的散列

vs91vp4v  于 2022-12-26  发布在  Ruby
关注(0)|答案(4)|浏览(160)

例如
我有一个散列:
第一个月
我可以按如下所示修改散列:
@something.each { |(k,v)| @something[k] = v*2 }

  • 是否有一种快捷方式来引用大括号中的变量@something?*

这也可以通过使用reduce方法来解决,该方法完全避免了该问题,但增加了权重或转换为数组并使用map
或者只是个坏主意。

lmvvr0a8

lmvvr0a81#

我将使用transform_values而不是each

@something = @something.transform_values{ |v| v * 2}

现在您根本不需要引用@something,因为您只是在创建一个新的散列。

jpfvwuh4

jpfvwuh42#

也可以使用#each_with_object来构建新的散列。

@something.each_with_object({}) { |(k, v), h| h[k] = v * 2 }
# => {:a=>2, :b=>4, :c=>6}
wsxa1bj1

wsxa1bj13#

虽然已经给出了更好的答案,但还有其他几种选择:
使用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}
d7v8vwbk

d7v8vwbk4#

有没有一种在括号中引用变量@something的简写方法?
下面是一个狡猾的例子,使用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}

相关问题