Tidak, Ruby sebenarnya tidak mendukung pengembalian dua objek. (BTW: Anda mengembalikan objek, bukan variabel. Lebih tepatnya, Anda mengembalikan pointer ke objek.)
Itu, bagaimanapun, mendukung penugasan paralel. Jika Anda memiliki lebih dari satu objek di sisi kanan tugas, objek dikumpulkan menjadi Array:
foo = 1, 2, 3
foo = [1, 2, 3]
Jika Anda memiliki lebih dari satu "target" (variabel atau metode penyetel) di sisi kiri tugas, variabel terikat ke elemen Arraydi sisi kanan:
a, b, c = ary
a = ary[0]
b = ary[1]
c = ary[2]
Jika ruas kanan bukan sebuah Array, itu akan diubah menjadi satu dengan menggunakan to_arymetode ini
a, b, c = not_an_ary
ary = not_an_ary.to_ary
a = ary[0]
b = ary[1]
c = ary[2]
Dan jika kita menggabungkan keduanya, kita mendapatkannya
a, b, c = d, e, f
ary = [d, e, f]
a = ary[0]
b = ary[1]
c = ary[2]
Terkait dengan ini adalah operator percikan di sisi kiri tugas. Artinya "ambil semua elemen kiri-atas Arraydi sisi kanan":
a, b, *c = ary
a = ary[0]
b = ary[1]
c = ary.drop(2)
Dan yang tak kalah pentingnya, tugas paralel dapat disarangkan menggunakan tanda kurung:
a, (b, c), d = ary
a = ary[0]
b, c = ary[1]
d = ary[2]
a = ary[0]
b = ary[1][0]
c = ary[1][1]
d = ary[2]
Ketika Anda returndari sebuah metode atau nextatau breakdari sebuah blok, Ruby akan memperlakukan hal semacam ini seperti sisi kanan sebuah tugas, jadi
return 1, 2
next 1, 2
break 1, 2
return [1, 2]
next [1, 2]
break [1, 2]
Ngomong-ngomong, ini juga berfungsi dalam daftar parameter metode dan blok (dengan metode yang lebih ketat dan blok tidak terlalu ketat):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
Pemblokiran menjadi "kurang ketat" misalnya yang membuat Hash#eachberhasil. Sebenarnya ini yieldadalah satu dua elemen Arraykunci dan nilai ke blok, tetapi biasanya kami menulis
some_hash.each {|k, v| }
dari pada
some_hash.each {|(k, v)| }