Я только что представил себя в Ruby splat oprator. И я много играл с ним. но приведенный ниже эксперимент каким-то образом заставил меня подумайте об этом дважды:)
langs = ["java", "csharp", "ruby", "haskell" ]
# => ["java", "csharp", "ruby", "haskell"]
l1,*,l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]
l1
# => "java"
l2
# => "haskell"
l1,*,*,l2 = *langs
SyntaxError: (irb):27: syntax error, unexpected tSTAR
l1,*,*,l2 = *langs
^
from /usr/bin/irb:12:in `<main>'
Да, ошибка очевидна, так как я использовал более 1 оператора *(splat)
в том же списке аргументов.
Теперь я попытался сыграть с ним.
l1,(*),(*),l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]
Аааа! здесь он работает. Но не мог понять, почему так?
l1
# => "java"
l2
# => "haskell"
l1,(*),l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]
l1
# => "java"
l2
# => "ruby"
Из приведенного выше примера кажется, что он пропускает элементы массива.
Вопросы:
-
(a) что вызывается оператор (*)?
-
(b) когда я использовал в splat (*) в строке
l1,*,l2 = *langs
, он потребляет все элементы -"csharp", "ruby"
. Есть ли способ увидеть, что*
потребляет там технически? Очевидно, что я связываюсь с использованием, еслиl1,*,l2 = *langs
неl1,l*,l2 = *langs
.