我有一个'奇怪'问题,下面的代码将位置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方法中变量的范围不应影响这里的位置变量,我是错误的,它们都是在单独的方法中声明的,它们不是类级别的。
答案 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方法也是如此。