为变量分配字符串或数组的长度会导致 Ruby 中的 "dynamic constant assignment" 错误

Assigning a variable the length of a string or array causes a "dynamic constant assignment" error in Ruby

我今天开始使用 Ruby 并查找基本操作的适当语法。显然我不够小心,因为下面调用 length 的行抛出了错误“动态常量分配”。修复后可能还有更多错误有待发现,但目前我只关注这个错误。

def isPalindrome(n)
    m = n.to_s;
    L = m.length; <-- error
    for i in 0..L/2
        if(m[i] != m[L-1-i])
            return false;
        end
    end
    return true;
end

def nthmax(n, a)
    L = a.length; <-- error
    if(n > L)
        return nil;
    end
    a.sort;
    return a[L-n];
end

搜索错误消息会找到有关当有人试图为常量分配一个实际上不是常量的值时如何抛出错误的帖子。给出的问题 here 是不相关的,因为我并没有试图让 L 成为一个常数(添加这个信息是为了澄清这个问题,在我问的时候,不是重复的,也不是重复的现在)。

事实证明,如果变量的第一个字母大写,则将其视为常量。 “L”应该改为“l”。

您偶然发现了 Ruby 语言中一个不寻常的设计方面。 Ruby 没有 constants,但它将以大写字母开头的标识符称为 常量 。您可以修改它们,但如果您这样做,则会收到警告( 而不是 错误!),因为它发生在您对 L 的分配中。如果你真的想在没有警告的情况下修改常量,你可以用

# Don't do this unless you really have to!!!!
self.class.send(:remove_const, :L) # Make it disappear
L = new_value # Recreate it

这被认为是不好的做法(你已经可以从 remove_const 现在是一个私有方法这一事实中猜到),如果你进入 Ruby 元编程,你主要会使用这些技巧.在你的情况下,我看不出你为什么不能使用普通的局部变量。