除非声明我们是否使用else?

时间:2016-07-28 05:44:09

标签: ruby-on-rails ruby

关于else声明存在我们不应该将其与unless一起使用的意见吗?

任何人都可以解释为什么会这样,或者我们可以自由地去任何我们喜欢的地方?

8 个答案:

答案 0 :(得分:33)

您绝对可以elseunless一起使用。 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)

是的,我们可以将elseelse一起使用。我们可以随意前往任何我们喜欢的地方,但有些人认为将unlessunless 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)

是的,我们可以将unlesselse一起使用。但写作

并非最佳做法
unless foo
  # Foo
else
  #Bar
end

它不是更易读的代码。 Here是一些Ruby编码风格指南,大多数开发人员都遵循这些指南。

答案 4 :(得分:4)

Ruby允许它,但 in English “if ... else”(或“if ... otherwise”)是一种常见的结构,而“除非......其他”几乎闻所未闻对于许多母语使用者拒绝它不正确的程度。

这导致与Ruby中的unless/else混淆。母语不允许的人不习惯遵循它。这就是为什么有很多意见反对它。由于Ruby支持它,你当然可以自由地使用它。

答案 5 :(得分:2)

从技术上讲,将unlesselse

一起使用是完全可以的
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 trueif !trueunless 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,除非它是一个糟糕的方法。