解构比较运算符的参数
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?" 你可以只使用一个普通变量,没有理由将它包装在一个数组中(在给定的上下文中)。
已编辑的问题: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?" 你可以只使用一个普通变量,没有理由将它包装在一个数组中(在给定的上下文中)。