我最近学习了Ruby编程语言,总而言之,它是一门很好的语言.但我很惊讶地发现它并不像我预期的那么简单.更准确地说,"最不惊讶的规则"对我来说似乎并不受到尊重(当然这是非常主观的).例如:
x = true and false
puts x # displays true!
Run Code Online (Sandbox Code Playgroud)
和着名的:
puts "zero is true!" if 0 # zero is true!
Run Code Online (Sandbox Code Playgroud)
你会警告一个Ruby新手的其他"问题"是什么?
在ruby中,有一种方法可以在定义变量或常量后"取消定义"它吗?
在我们的轨道environemnts,我们定义了三个contants之一是true,根据不同的环境:TESTING,DEVELOPMENT或PRODUCTION.然后,在控制器代码中,我们使用defined?以查看我们所处的环境,即:defined? PRODUCTION.
现在,我想对一些特定于环境的行为进行单元测试.我最初的尝试是在我的测试中设置适当的常量,然后在拆解时重置它们.然而,我无法弄清楚如何重置DEVELOPMENT,并PRODUCTION使得defined?返回false.
显然,一个解决方案就是只检查合适的常量是否也是真的,除了检查它是否已定义,但这将导致必须触及相当数量的现有代码.
编辑:我意识到这绝对不是正确的做事方式.唉,改变它是一项非常重要的任务,所以我正在寻找一种简单的方法来单独测试现在的情况.另外,我也很好奇关于是否有可能取消定义变量/常数的低级语言问题.
我的googlefu糟透了,无法找到相关信息.
基本上我想要一个只在类/模块范围内可见的实例变量,但也是不可变的.
我是Ruby的新手,如果这个问题没有多大意义,我会道歉.
Ruby常量究竟意味着什么?以下代码未显示任何"常量"属性.警告就在那里,但我仍然要改变A指的是什么.
A = 1
puts A # => 1
A = 2 # warning: already initialized constant A
puts A # => 2
Run Code Online (Sandbox Code Playgroud)
或者Ruby常量只是一个没有任何执行的指示?
我早就意识到Ruby中的"常量"(即大写的变量名)并不是真正的常量.与其他编程语言一样,对象的引用是存储在变量/常量中的唯一内容.(补充工具栏:Ruby确实可以"冻结"被引用的对象被修改,据我所知,这不是许多其他语言提供的能力.)
所以这是我的问题:当你将一个值重新分配给一个常量时,你会得到一个警告:
>> FOO = 'bar'
=> "bar"
>> FOO = 'baz'
(irb):2: warning: already initialized constant FOO
=> "baz"
Run Code Online (Sandbox Code Playgroud)
有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配.