Тернарный оператор не работает внутри функции Lambda Ruby

Я пытаюсь написать лямбда-функцию в 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] }

Может быть, вы ищете в Rails?метод.

Stefan 10.07.2024 23:09
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оператор 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). Почему так много способов? Не имею представления.

Cary Swoveland 11.07.2024 03:27

ActiveSupport также добавляет Object#in?, что позволит вам написать n.in?([1, 2])

Alexander 12.07.2024 03:43

Другие вопросы по теме