解构比较运算符的参数

Destructuring arguments to comparison operators

已编辑的问题:Ruby 语法是否允许在使用比较运算符时以一种很好的方式解构数组?

原始问题:Ruby 语法是否允许以一种很好的方式解构数组?

对于方法调用,可以使用 Splat 运算符 (*),但是否可以在不调用方法的情况下执行此操作?

这是允许的:

foo = ['bar']
'bar'.==(*foo) # => true

可以这样写吗?

'bar' == *foo
# => *** SyntaxError Exception: (byebug):1: syntax error, unexpected *
# => 'bar' == *foo

编辑: 问题来自看起来有点像这样的代码:

assert('test@example.com' == *email.to) # => Syntax error
assert_equal('test@example.com', *email.to) # => Success
foo, = ['bar']
#⇒ ["bar"]
foo
#⇒ "bar"

变量的数量可能视需要而定。

foo, bar, *baz = %w|foo bar baz|
foo
#⇒ "foo"
bar
#⇒ "bar"
baz
#⇒ ["baz"]

'bar' == *foo 不起作用的原因是因为对于大多数运算符(包括比较运算符),解析器只需要 一个 参数。在 'bar'.==(*foo) 的情况下,该方法仍然需要一个参数,但解析器没有发现问题,因为您使用普通方法调用来调用它。要解决这个问题,您可以在数组上调用 #first'bar' == foo.first


这对 #assert_equal 起作用的原因是因为 email.to 数组的元素作为参数发送。

但是,如果数组为空,您将收到参数错误:

ArgumentError: wrong number of arguments (given 1, expected 2..3)

如果数组包含超过 2 个元素,您将收到错误消息:

ArgumentError: wrong number of arguments (given 4, expected 2..3)

如果数组包含 2 个元素,则第二个元素用作失败时的错误消息。

总之,如果数组只包含一个元素,您将只能得到想要的结果。这就提出了一个问题 "Why use an array in the first place?" 你可以只使用一个普通变量,没有理由将它包装在一个数组中(在给定的上下文中)。