Ruby哈希值转换为字符串,不知道为什么

时间:2010-08-11 09:00:36

标签: ruby

我有一个'奇怪'问题,下面的代码将位置lat值转换为字符串(每次迭代都带有+符号),在比较值时会导致最终异常。我已尝试使用其他位置的值的代码,它工作正常。唯一的区别是其他数字是负数。

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

在进入支票推文位置之前会出现此问题。哈希的值如下

总而言之,我的问题是,任何人都可以向我解释为什么位置[:lat]在这种情况下最终成为一个字符串?

Bottom初始化为30.0400,分配给:lat值。 checkTweets方法只是根据mongodb查询编写文件。

对,我找到了解决方法。正是twitter库将Hash浮点值转换为字符串。

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

1 个答案:

答案 0 :(得分:2)

  

我错误地认为checkTweets方法中变量的范围不应该影响这里的位置变量,它们都是在单独的方法中声明的,它们不是类级别的。

不,但可变范围不是问题。 location变量是您的方法的本地变量,因此checkTweets方法无法更改。这是对的。

然而,可以从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方法也是如此。