解构比较运算符的参数

时间:2018-08-09 09:11:26

标签: ruby destructuring

编辑后的问题:使用比较运算符时,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

2 个答案:

答案 0 :(得分:0)

foo, = ['bar']
#⇒ ["bar"]
foo
#⇒ "bar"

可能需要多少个变量。

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

答案 1 :(得分:0)

'bar' == *foo不起作用的原因是,解析器期望大多数运算符(包括比较运算符)精确地一个参数。在'bar'.==(*foo)的情况下,该方法仍然需要一个参数,但是解析器看不到问题,因为您是使用常规方法调用来调用它的。要解决此问题,您只需在数组上调用#first


之所以对#assert_equal有效,是因为'bar' == foo.first数组的元素作为参数发送。

但是,如果数组为空,则会出现参数错误:

  

ArgumentError:参数数量错误(给定1,应为2..3)

如果数组包含两个以上的元素,则会出现错误:

  

ArgumentError:参数数量错误(给定4个,预期2..3)

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

最后,只有在数组仅包含一个元素的情况下,您才能获得所需的结果。这就提出了一个问题:“为什么首先要使用数组?”您可以只使用普通变量,没有理由将其包装在数组中(在给定的上下文中)。