用ruby编写这个.map()的更好方法?
我有这样一个数组:用ruby编写这个.map()的更好方法?,ruby,arrays,code-cleanup,Ruby,Arrays,Code Cleanup,我有这样一个数组:[[3,1],4[3,3,4],4,:sync,1,2] 我想通过数组映射,然后 如果该项是整数,请将其替换为其他项 如果项是数组,则仅替换索引0项,然后返回数组 这是我目前所拥有的,但它非常丑陋。有没有更好的方法写这个 也许我可以使用#点击 work.map! do |w| if w.is_a? Array w[0] = console.button_map[w[0]] || w[0] w else console.button_map[w
[[3,1],4[3,3,4],4,:sync,1,2]
我想通过数组映射,然后
- 如果该项是整数,请将其替换为其他项
- 如果项是数组,则仅替换索引0项,然后返回数组
#点击
work.map! do |w|
if w.is_a? Array
w[0] = console.button_map[w[0]] || w[0]
w
else
console.button_map[w] || w
end
end
我决定了,不确定它是否能更干净:
work.map! do |w|
if w.is_a? Array
w.tap{|x| x[0] = console.button_map[x[0]] || x[0] }
else
console.button_map[w] || w
end
end
我将使用Array()
规范化输入,然后只剩下大小写:
work.map! do |w|
element = Array(w).first
console.button_map[element] || element
end
注:
可能更适合代码复查堆栈交换。甚至两个单独的映射:a.map{e}数组(e).first}.map{e}控制台.button_map[e]|e}
。我不懂。我理解element=Array(work)。首先
(我相信你也可以写element=[*work]。首先
),但是如果(参数)work
是一个数组,你不是把它映射到它的第一个元素的某个函数上了吗,而不是保留它的其余部分?@CarySwoveland:将输入转换为数组,除非它已经是数组:array(nil)#=>[]
,array(:foo)#=>[:foo]
,但是array([:foo])却=>[:foo]
不错!这是个了不起的主意。
work = [[3, 1], 4, [3, 3, 4], 4, :sync, 1, 2, [5]]
work.map! do |w|
val = my_method [*w].first
case w
when Array then [val, *w[1..-1]]
else val
end
end
def my_method(n)
case n
when Fixnum then n+4
else n.to_s
end
end
work
#=> [[7, 1], 8, [7, 3, 4], 8, "sync", 5, 6, [9]]
[*[1,2]] #=> [1,2]
[*3] #=> [3]