代码之家  ›  专栏  ›  技术社区  ›  Steve

Ruby哈希值转换为字符串,不知道原因

  •  0
  • Steve  · 技术社区  · 16 年前

    我有一个“奇怪”的问题,下面的代码将location lat值转换为一个字符串(每次迭代都有一个+符号),这导致了在比较值时出现最终异常。我已经用另一个位置的值尝试了代码,它工作得很好。唯一的区别是其他的数字都是负数。

    location= {:lng => 2.0781,:lat => 41.2899}
    while location[:lat] < top
          sleep(1)
          checkTweets(location)
          bottom+=0.075
          location[:lat] = bottom
    end
    

    问题发生在进入检查tweets位置之前。散列值如下

    最后,我的问题是,有人能向我解释为什么在这种情况下位置[:lat]最终成为字符串吗?

    底部初始化为30.0400,分配给:lat值。checktweets方法只是基于mongodb查询编写一个文件。

    对,我找到了解决办法。正是Twitter库将哈希浮点值转换为字符串。

    假设checktweets方法中变量的范围不应影响此处的位置变量,这是错误的吗?它们都是在单独的方法中声明的,它们不是类级别的。

    1 回复  |  直到 16 年前
        1
  •  2
  •   sepp2k    16 年前

    我错误地假设checktweets方法中变量的范围不应影响此处的位置变量,它们都是在单独的方法中声明的,它们不是类级别。

    不,但是变量范围不是这里的问题。location变量是方法的局部变量,因此不能由checktweets方法更改。没错。

    然而,location变量引用的对象可以从checktweets方法中更改,这正是发生的事情(尽管我不得不说可变参数的样式非常糟糕)。

    举例说明Ruby中的引用语义和突变:

    def f1(arr)
      arr = [1,2,3] # Changes the variable arr, which is local to f1
                    # This change is not visible on the outside
    end
    
    def f2(arr)
      arr.concat [1,2,3] # Changes the object that arr refers to
                         # This change will be visible any place where the same
                         # array is referenced
    end
    
    foo = [42,23]
    f1(foo)
    # foo is still [42, 23]
    f2(foo)
    # foo is now [42, 23, 1, 2, 3]
    

    在这里,变量foo没有被更改为引用另一个对象(从方法内部是不可能的),但是foo引用的对象已经被更改。同样的情况也发生在你的checktweets方法中。

    推荐文章