Ответ 1
Вы можете:
a = ['a', 'b']
Hash[a.map {|v| [v,v.upcase]}]
У меня есть массив строк и хочу сделать хэш из него. Каждый элемент массива будет ключом, и я хочу, чтобы значение вычислялось из этого ключа. Есть ли способ Ruby сделать это?
Например:
['a','b']
для преобразования в {'a'=>'A','b'=>'B'}
Вы можете:
a = ['a', 'b']
Hash[a.map {|v| [v,v.upcase]}]
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a}
Здесь наивное и простое решение, которое преобразует текущий символ в символ, который будет использоваться в качестве ключа. И просто для удовольствия он капитализирует ценность.:)
h = Hash.new
['a', 'b'].each {|a| h[a.to_sym] = a.upcase}
puts h
# => {:a=>"A", :b=>"B"}
Каким бы способом вы ни посмотрели на это, вам нужно будет итерации исходного массива. Здесь другой способ:
a = ['a', 'b', 'c']
h = Hash[a.collect {|v| [v, v.upcase]}]
#=> {"a"=>"A", "b"=>"B", "c"=>"C"}
Не уверен, что это настоящий Ruby-способ, но должен быть достаточно близко:
hash = {}
['a', 'b'].each do |x|
hash[x] = x.upcase
end
p hash # prints {"a"=>"A", "b"=>"B"}
В качестве функции мы имели бы это:
def theFunk(array)
hash = {}
array.each do |x|
hash[x] = x.upcase
end
hash
end
p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"}
Ruby each_with_object
метод - это аккуратный способ сделать то, что вы хотите
['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase }
Здесь другой способ:
a.zip(a.map(&:upcase)).to_h
#=>{"a"=>"A", "b"=>"B"}