我最近学习了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新手的其他"问题"是什么?
简而言之,为什么以下三条线的影响不一样?
if @controller.controller_name == "projects" || @controller.controller_name == "parts"
if @controller.controller_name == ("projects" || "parts")
if @controller.controller_name == "projects" || "parts"
Run Code Online (Sandbox Code Playgroud)
第一个给出了我想要的结果,但实际上有更多选项而不仅仅是项目和部分,使用该表单创建了一个详细的语句.另外两个更紧凑,但不会给我相同的结果.
哪些子程序与其他子程序不一样?
sub or1 {
my ($a,$b) = @_;
return $a || $b;
}
sub or2 {
my ($a,$b) = @_;
$a || $b;
}
sub or3 {
my ($a,$b) = @_;
return $a or $b;
}
sub or4 {
my ($a,$b) = @_;
$a or $b;
}
Run Code Online (Sandbox Code Playgroud)
我从C和Perl 4来到Perl 5并一直使用,||直到我看到更多的脚本使用or,我喜欢它的样子.但正如上面的测验所显示的那样,对于那些粗心大意的人来说,这并非没有缺陷.对于同时使用这两种结构或者使用很多结构的人来说or,您使用什么经验法则来决定使用哪种结构并确保代码正在执行您认为正在执行的操作?
我对Ruby中的和/ &&/=关键字有疑问.
ruby文档说,所提到的关键字的优先级是:(1)&&,(2)=,(3)和.
我写了这段代码:
def f(n)
n
end
if a = f(2) and b = f(4) then
puts "1) #{a} #{b}"
end
if a = f(2) && b = f(4) then
puts "2) #{a} #{b}"
end
Run Code Online (Sandbox Code Playgroud)
输出是:
1)2 4 [预期]
2)4 4 [ 为什么?]
出于某种原因,使用&&会导致a和b评估为4?
我在这里从根本上误解了Ruby吗?我已经写了大约2年的Ruby代码了,就在今天偶然发现了......
ruby-1.8.7-p249 > i = true and false
=> false
ruby-1.8.7-p249 > i
=> true
Run Code Online (Sandbox Code Playgroud)
有人能解释一下这里发生了什么吗?我确定这是规格,但这对我来说似乎有点直观......
我不知道为什么红宝石给and,or少优先级比&&,||和赋值运算符?有什么缘故吗?
我的印象是||并且or是同义词.
设置变量or不具有值; 为什么?
>> test = nil or true
=> true
>> test
=> nil
>> test = false or true
=> true
>> test
=> false
Run Code Online (Sandbox Code Playgroud)
与'预期'一起工作 ||
>> test = nil || true
=> true
>> test
=> true
Run Code Online (Sandbox Code Playgroud) 可能重复:
Ruby:||之间的区别 和'或'
使用Ruby
||
Run Code Online (Sandbox Code Playgroud)
和
or
Run Code Online (Sandbox Code Playgroud)
是非常常见的做法,这使得了解两者之间的区别很重要,不幸的是我不确定.
首先我的问题是如果以下假设是正确的:
EX1:
if @variable_1 || @variable_2 || @variable_3
do something
else
do nothing
end
Run Code Online (Sandbox Code Playgroud)
EX2:
if @variable_1 or @variable_2 or @variable_3
do something
else
do nothing
end
Run Code Online (Sandbox Code Playgroud)
所以在第一个例子中,如果任何变量为false,那么它将执行"什么都不做"
但是,对于第二个示例,将检查所有变量,如果一个为真,则执行"执行某些操作".
总之使用"||" 如果你有一个需要检查的变量列表,如果其中一个返回false,那么一个标志会上升.将第二个示例与变量列表一起使用,其中只需要一个变量才能继续执行所需的代码.
这些假设是否正确?
这是真的,在大多数情况下,在Ruby中,最好是使用&&,||而不是and,or除非是一些特殊的情况.
我认为Ruby的一个设计原则是尽可能减少意外,因此使用and或or实际上有一些惊喜......例如and没有比优先级更高的优先级or,而&&优先级高于||.
所以我认为在大多数情况下,使用&&,||.在知道某些特殊情况下,可能需要使用and,or但我认为,如果这些与混合&&,||早晚可能会创建的错误时,你的同事谁在Ruby中开始就在不久前需要编辑的代码.
我有这个代码(像这样)
foo = nil or 4
Run Code Online (Sandbox Code Playgroud)
我希望foo成为第一个值(可能是nil),还是默认值4.当我在irb中测试时,输出就是我所期望的.傻傻的我,我没有检查以后的价值foo.过了一会儿,我开始注意到我的代码中出现了一些错误,直到我检查了fooirb中的返回值,我才发现问题,这是哦,意外,nil而不是预期的4.
关于orvs 的故事是||什么?它们应该作为替代品吗?是否有一些警告使用or而不是||?