this问题我发现了一个关于Java中final
变量范围的有趣细节。我不太了解Java,但我认为final
与Ruby中的常量相同。Ruby中循环的常量和作用域
在C++中,这是可能的:
for(int i = 0; i < 5; ++i){
const int c = i * 5;
std::cout << c << std::endl;
}
试图在循环过程中更改数值是不可能的,但并为您提供了一个编译时错误。
我很好奇,想看看红宝石将如何处理这个问题,开始IRB写了这样的代码来测试它:
5.times do |x|
XPI = x * Math::PI
puts x
end
结果被
0.0
(irb):27: warning: already initialized constant XPI
3.141592653589793
(irb):27: warning: already initialized constant XPI
6.283185307179586
(irb):27: warning: already initialized constant XPI
9.42477796076938
(irb):27: warning: already initialized constant XPI
12.566370614359172
=> 5
所以我的问题:是否有办法在循环开始时为每个循环迭代初始化一个常量而不创建警告消息?它可能有一些真实世界的用例,当我想根据迭代器变量进行计算,然后确保结果不会改变为剩余的循环。
没有你需要每一天,但我只是好奇。
我认为你是对的,它不适合Ruby哲学。虽然我认为它不只是一个局部变量。我认为,在强类型的情况下,这种'合约'的可靠性不能在一定范围内改变变量内容是合理的。 –