array.include? 'foo' or array.include? 'bar'
这是一个语法错误(意外的关键字或)。添加括号可以解决该问题,但由于我对Ruby还很陌生,不知道以下两种方式哪种被认为更符合惯用法:
选项1
array.include?('foo') or array.include?('bar')
选项2
(array.include? 'foo') or (array.include? 'bar')
这是个人偏好问题,还是有一种方法被认为更“正确”?
array.include? 'foo' or array.include? 'bar'
这是一个语法错误(意外的关键字或)。添加括号可以解决该问题,但由于我对Ruby还很陌生,不知道以下两种方式哪种被认为更符合惯用法:
array.include?('foo') or array.include?('bar')
(array.include? 'foo') or (array.include? 'bar')
这是个人偏好问题,还是有一种方法被认为更“正确”?
class Person
attr_reader :name, :age
# omitted
end
temperance = Person.new('Temperance', 30)
temperance.name
puts temperance.age
x = Math.sin(y)
array.delete(e)
validates(:name, presence: true)
# 好的写法
validates :name, presence: true
- tgfruby-1.9.2-p290 :002 > array = ['bar']
=> ["bar"]
ruby-1.9.2-p290 :003 > array.include? 'foo' or array.include? 'bar'
=> true
or
的低优先级允许在不加括号的情况下工作。这种特性应该使它成为 Ruby(甚至 Perl)的习惯用法。or
。使用 || 可能更好,因为它具有像其他运算符一样的高优先级,并且更常见。我认为出于看起来像英语的目的而使用 or
不是一个好的做法。它在语言中有语义意义,最好用于那些特点。=
的优先级高于or
,所以当你这样写时,你实际上是在说(result = array.include? 'foo') or array.include? 'bar'
。显然,这会导致失败。条件语句可以正常工作(例如if ...; ... end
),如果你将整个表达式用括号括起来也可以。这就是or
的使用场景,但完全可以避免使用它。我几乎从不使用它。最终,行为驱动开发和证明代码的正确性是值得的。这使你可以自由地玩耍你的实现,而这才是 Ruby 的真正乐趣。 - Blake Taylorand
和 or
的很好的介绍。http://avdi.org/devblog/2010/08/02/using-and-and-or-in-ruby/ 对于任何困惑,我表示抱歉。 - Blake TaylorAvdi Grimm认为你不应该使用and
或or
进行布尔逻辑运算。你只应该在控制流(类似于if
或unless
)中使用and
或or
。
根据他的建议,你应该使用||
代替:
array.include?('foo') || array.include?('bar')
||
运算符:if array == 'foo' || 'bar'
。在这种情况下,如果你用or
替换||
,它总是会通过,因为你会说“如果数组是'foo',或者如果'bar'返回true。”你可以把它想象成,在假定的括号内使用||
,而在外面使用or
:if (array == 'foo' || 'bar')
与if (array == 'foo') or 'bar'
。我希望这能更清楚地解释一些。 - brickeror
:) - Rob Grant