为什么冻结分配给常量的可变对象?

时间:2017-11-01 01:18:50

标签: ruby string rubocop frozen

考虑一下rubocop报告的这种攻击

$(document).ready(function () {
        $.ajax({
            url: "http://xx.xx.xx.xx:xx/api/values",
            type: "GET",
            dataType: "json",
            headers: { "HeaderName": "MYKey" }
        });
    });

为什么要冻结此IP地址?

2 个答案:

答案 0 :(得分:14)

冻结对象意味着不再允许你改变它。常量意味着您不再允许变更绑定。 (好吧,如果你改变了绑定,你会得到一个警告。)这两个就好了。

特别是,分配给不可变绑定的可变对象仍然可以变异的事实可能会使某些人感到困惑。只是见证Stack Overflow关于它的各种问题:

IP = '34.111.241.111'
# Dis is a constant, I can never change it, amirite?

IP << '.255'

IP
#=> '34.111.241.111.255'
# Ooops!

IP.freeze

IP << '.255'
# RuntimeError: can't modify frozen String

答案 1 :(得分:13)

您应该冻结分配给IP的值,因为您已将IP声明为常量。这表示您不希望变更分配给IP的值。

问题是在ruby中,为常量赋值不会使值不可变。如果改变分配给常量的值,则会收到警告。要使值实际不可变,您需要.freeze赋给常量的值。在冻结分配给常量的值后,如果尝试更改该值,则会遇到运行时错误。