Ruby I';我正试图把数组变成散列。数组项=索引。字符串的值=字符串。整数的长度值=整数^2
我得到的是#的未定义局部变量或方法'newHash'”Ruby I';我正试图把数组变成散列。数组项=索引。字符串的值=字符串。整数的长度值=整数^2,ruby,arrays,hash,Ruby,Arrays,Hash,我得到的是#的未定义局部变量或方法'newHash'” 我是个新手,非常感谢您的帮助。看来您已经非常接近了。我会这样做: myarray = ["Hello", 5, "Hi"] def arrayToHash(array) newHash = Hash.new() array.each do |x| if x.is_a? String newHash[x.to_sym] = x.length elsif x.is_a? Integer new
我是个新手,非常感谢您的帮助。看来您已经非常接近了。我会这样做:
myarray = ["Hello", 5, "Hi"]
def arrayToHash(array)
newHash = Hash.new()
array.each do |x|
if x.is_a? String
newHash[x.to_sym] = x.length
elsif x.is_a? Integer
newHash[x] = x*x
else
newHash[x] = nil
end
end
end
arrayToHash(myarray)
puts newHash
试试下面的代码
def array_to_hash(array)
array.reduce({}) do |result, item|
if item.is_a? String
result.merge(item.to_sym => item.length)
elsif item.is_a? Integer
result.merge(item => item * item)
end
end
end
array_to_hash(["Hello", 5, "Hi"])
=> {:Hello=>5, 5=>25, :Hi=>2}
newHash
是arrayToHash
方法的局部变量,它仅从内部有效和可访问。您可能想从方法内部调用它,也许就在您退出之前
def array_to_hash(array)
rb_hash = Hash.new do |hash, key|
if key.is_a? String
hash[key.to_sym] = key.length
elsif key.is_a? Integer
hash[key] = key ** 2
else
nil
end
end
array.each do |elem| rb_hash[elem] end
rb_hash
end
您的代码很好,但它只是在方法内部创建
newHash
。它是一个局部变量,在方法返回时消失。因此,您希望方法返回值:
myarray = ["Hello", 5, "Hi"]
def arrayToHash(array)
newHash = Hash.new()
array.each do |x|
if x.is_a? String
newHash[x.to_sym] = x.length
elsif x.is_a? Integer
newHash[x] = x*x
else
newHash[x] = nil
end
end
puts newHash # =>{:Hello=>5, 5=>25, :Hi=>2}
end
arrayToHash(myarray)
然后在调用该方法时,必须将返回值赋给某个对象:
def arrayToHash(array)
newHash = Hash.new()
array.each do |x|
if x.is_a? String
newHash[x.to_sym] = x.length
elsif x.is_a? Integer
newHash[x] = x*x
else
newHash[x] = nil
end
end
return newHash
end
对Ruby进行了一些改进,或者至少进行了一些更改,使其更符合Ruby的习惯
这纯粹是装饰性的,但红宝石爱好者更喜欢像这样的名字,而不是像这样的名字。所以数组到散列
,我的数组
,等等
如果您只需要一个纯空哈希,那么可以使用{}
而不是hash.new()
一般来说,每当您发现自己创建了一个新对象,然后在某个对象上循环以向该对象添加内容时,您只需调用map
或reduce
即可完成相同的工作。在这种情况下:
myHash = arrayToHash(myarray)
还有一个变体:
my_hash = my_array.reduce({}) do |new_hash, x|
if x.is_a? String
new_hash[x.to_sym] = x.length
elsif x.is_a? Integer
new_hash[x] = x*x
else
new_hash[x] = nil
end
new_hash
end
我已经更改了一些变量名以符合Ruby的要求。你不必这么做,但大多数红宝石爱好者都遵循惯例。谢谢你如此详尽的回答!:)我一定会做出所有这些改进!这是一个有趣的方法。对于else
,是否希望hash[key]=nil
?
def array_to_hash(array)
array.each_with_object({}) do |x, hash|
case x
when String
hash[x.to_sym] = x.length
when Integer
hash[x] = x*x
else
hash[x] = nil
end
end
end
array_to_hash( ["Hello", 5, "Hi"] )
#=> { :Hello => 5, 5 => 25, :Hi => 2 }