关于else
声明存在我们不应该将其与unless
一起使用的意见吗?
任何人都可以解释为什么会这样,或者我们可以自由地去任何我们喜欢的地方?
答案 0 :(得分:33)
您绝对可以将else
与unless
一起使用。 E.g:
x=1
unless x>2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
将打印“x为2或更小”。
但仅仅因为你可以做某事并不意味着你应该。通常情况下,这些结构会令人费解,您可以使用简单的if
来更好地用积极的方式表达您的情况:
x=1
if x<=2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
答案 1 :(得分:19)
是的,我们可以将else
与else
一起使用。我们可以随意前往任何我们喜欢的地方,但有些人认为将unless
与unless true
puts "one"
elsif true
puts "two"
else
puts "three"
end
SyntaxError: compile error
syntax error, unexpected kELSIF, expecting kEND
一起使用并不是一个好习惯。我们需要避免这种情况。
不幸的是,除非声明支持否则构造不是elsif或者不包含在其中。
$("#myForm").ajaxForm({
success: function(res, status, xhr, form) {
// This will show the direct res over here, you can format it as per your need.
$('#posthere').html(res);
}
});
这也可能是它限制我们的原因。
答案 2 :(得分:5)
没有什么可以阻止任何人使用unless - else
。这完全有效。
在某些情况下,unless
很容易理解。但是,当与else
语句结合使用时,if - else
总是更容易来理解而不是unless - else
。想象一下,试图理解unless - else
条件的其他部分。这是双重否定,双重否定只是非常不错。
此外,如果&&
和||
运算符的组合有很多条件,unless
变得更难以理解
答案 3 :(得分:4)
是的,我们可以将unless
与else
一起使用。但写作
unless foo
# Foo
else
#Bar
end
它不是更易读的代码。 Here是一些Ruby编码风格指南,大多数开发人员都遵循这些指南。
答案 4 :(得分:4)
Ruby允许它,但 in English “if ... else”(或“if ... otherwise”)是一种常见的结构,而“除非......其他”几乎闻所未闻对于许多母语使用者拒绝它不正确的程度。
这导致与Ruby中的unless/else
混淆。母语不允许的人不习惯遵循它。这就是为什么有很多意见反对它。由于Ruby支持它,你当然可以自由地使用它。
答案 5 :(得分:2)
从技术上讲,将unless
与else
:
unless user.staff?
# do foo
else
# do bar
end
唯一的问题是它有时难以阅读和理解。由于代码的读取方式比编写方式更频繁,因此将重点放在可读性和编写将来易于理解的代码上是非常有意义的。
因此您可能希望将其更改为:
if !user.staff?
# do bar
else
# do foo
end
或者甚至更好地完全消除对条件的否定:
if user.customer?
# do bar
else
# do foo
end
if true
比if !true
或unless true
更容易理解,更易于解析。处理否定(有时甚至是双重否定)会让你三思而后行。因此,社区试图避免它。
但技术上很好......
答案 6 :(得分:1)
当unless ... else ...
块中的代码很长且else
块中的代码非常短时,使用unless
可能是合适的(比任何替代方案更具可读性)。
unless user.staff?
raise SecurityError, 'not authorized'
else
# ...
# ...
# ... lots of code
# ...
# ...
end
如果你反过来写这个,
if user.staff?
# ...
# ...
# ... lots of code
# ...
# ...
else
raise SecurityError, 'not authorized'
end
else子句可能会远离它的条件,以至于你让人们向上和向下滚动以保持头脑中的东西。
这个特殊的例子写得更好而没有else
......
unless user.staff?
raise SecurityError, 'not authorized'
end
# ...
# ...
# ... lots of code
# ...
# ...
......但这种转变并非总是可行。
答案 7 :(得分:0)
如果条件为假,则执行代码。如果条件为真,则执行else子句中指定的代码。
var treeData = [
{
"name": "Top Level",
"parent": "null",
"children": [
{
"name": "Level 2: A",
"parent": "Top Level",
"children": [
{
"name": "Son of A",
"parent": "Level 2: A"
},
{
"name": "Daughter of A",
"parent": "Level 2: A"
}
]
},
{
"name": "Level 2: B",
"parent": "Top Level"
}
]
},
{
"name": "Top Level",
"parent": "null",
"children": [
{
"name": "Level 2: A2",
"parent": "Top Level",
"children": [
{
"name": "Son of A2",
"parent": "Level 2: A2"
},
{
"name": "Daughter of A2",
"parent": "Level 2: A2"
}
]
},
{
"name": "Level 2: B2",
"parent": "Top Level"
}
]
}
];
我们可以使用else,除非它是一个糟糕的方法。