你不能重新定义赋值,因为它是一个操作符而不是一个方法。但是,如果您的 AllYourCode 类要从 Array 继承,那么您的示例将起作用。
当 Ruby 遇到赋值时,它会查看右侧,如果有多个右值,它会将它们收集到一个数组中。然后它查看左侧。如果那里有一个左值,则为其分配数组。
def foo
return "a", "b", "c" # three rvalues
end
x = foo # => x == ["a", "b", "c"]
如果有多个左值(更具体地说,如果它看到一个逗号),它会连续分配右值并丢弃多余的右值。
x, y, z = foo # => x == "a", y == "b", z == "c"
x, y = foo # => x == "a", y == "b"
x, = foo # => x == "a"
正如您所发现的,如果返回一个数组,您也可以进行并行赋值。
def bar
["a", "b", "c"]
end
x = bar # => x == ["a", "b", "c"]
x, y, z = bar # => x == "a", y == "b", z == "c"
x, y = bar # => x == "a", y == "b"
x, = bar # => x == "a"
因此,在您的示例中,如果 rb 是一个数组或从数组继承,则 x 和 y 将被分配其前 2 个值。