5

Ruby でこれを行うとします。

ar = [1, 2]
x, y = ar

次に、x == 1 および y == 2 です。同じ効果を生み出す独自のクラスで定義できるメソッドはありますか? 例えば

rb = AllYourCode.new
x, y = rb

これまでのところ、このような割り当てでできることは、x == rb と y = nil を作成することだけです。Python には次のような機能があります。

>>> class Foo:
...     def __iter__(self):
...             return iter([1,2])
...
>>> x, y = Foo()
>>> x
1
>>> y
2
4

3 に答える 3

2

ほとんど:

class AllYourCode
   def to_a
     [1,2]
   end
end

rb = AllYourCode.new
x, y = *rb
p x
p y

Splat は を呼び出そうとしto_ary、次に を呼び出そうとしto_aます。なぜこれをしたいのかわかりませんが、これArrayArray.

つまり、複数の割り当ての使用例は次のようなものです。

# swap
x, y = y, x

# multiple return values
quot, rem = a.divmod(b)

# etc.
name, age = "Person", 100

つまり、ほとんどの場合、( からArray) 割り当てられているオブジェクトは明らかではありません。

于 2009-04-20T03:50:57.103 に答える
1

メソッドではなく演算子であるため、割り当てを再定義することはできません。ただし、AllYourCode クラスが Array から継承する場合、例は機能します。

Ruby が代入に遭遇すると、右辺を調べ、複数の右辺値がある場合はそれらを配列に集めます。次に左側を見ます。そこに左辺値が 1 つある場合は、配列が割り当てられます。

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 つの値が割り当てられます。

于 2009-04-20T03:21:49.157 に答える