Ruby I';我正试图把数组变成散列。数组项=索引。字符串的值=字符串。整数的长度值=整数^2

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

我得到的是#的未定义局部变量或方法'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
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 }