Я пытаюсь написать лямбда-функцию в Ruby для вычисления n-го числа Фибоначчи.
fib = -> (n) { n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2] }
Это дает мне ошибку,
./fib.rb:3: warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby!
./fib.rb:3: syntax error, unexpected '?', expecting '}'
fib = -> (n) { n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2...
./fib.rb:3: syntax error, unexpected ']', expecting '}'
...{ n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2] }
./fib.rb:3: syntax error, unexpected ']', expecting '}'
...? 1 : fib.[n - 1] + fib.[n - 2] }
Я предполагаю, что предупреждение связано с использованием синтаксиса in
. А в остальном не могу понять ошибку, почему не работает тернарный оператор?
Я уже проверял вопрос Как написать условную лямбду в Ruby?, и я попробовал следовать этому примеру, но вместо этого выдал другую ошибку.
fib = -> (n) { (n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] }
./fib.rb:3: warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby!
./fib.rb:3: syntax error, unexpected '['
...(n) { (n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] }
./fib.rb:3: syntax error, unexpected ']', expecting '}'
...(n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] }
./fib.rb:3: syntax error, unexpected ']', expecting '}'
...? 1 : fib.[n - 1] + fib.[n - 2] }
Оператор in
в Ruby делает не то, что вы думаете. Это часть сопоставления с образцом в Ruby. Чтобы проверить, содержит ли массив элемент, используйте метод .include?
.
Синтаксис вызова лямбды также неверен: используйте либо точку с круглыми скобками, либо квадратные скобки без точки.
fib = -> (n) { [1, 2].include?(n) ? 1 : fib[n - 1] + fib[n - 2] }
p fib[10]
Выход:
55
«...либо используйте точку с круглыми скобками, либо квадратные скобки без точки», либо используйте fib.call(10)
или fib.yield(10)
. Почему так много способов? Не имею представления.
ActiveSupport также добавляет Object#in?, что позволит вам написать n.in?([1, 2])
Может быть, вы ищете в Rails?метод.