Есть ли рубиновый эквивалент Scala Option? - PullRequest
12 голосов
/ 22 июня 2011

Как мне смоделировать необязательное значение в ruby? У Scala есть Option [], который я ищу в ruby.

Ответы [ 6 ]

5 голосов
/ 22 июня 2011

В стандартной библиотеке нет эквивалента. Вы должны определить свой собственный. См. эту статью .

4 голосов
/ 22 июня 2011

Я не эксперт по Ruby, но я не думаю, что есть вариант Option. Поскольку Ruby является объектно-ориентированным, ничто не мешает вам написать собственную реализацию, но это не будет так полезно, как в статически типизированном языке, где компилятор заставляет правильно выполнить проверку пустого параметра , что является одним из основных моментов для использования этой конструкции. Конечно, есть и другие преимущества, такие как возможность объединения значений Option несколькими способами.

2 голосов
/ 28 сентября 2011

Вы проверили драгоценный камень Rumonade ? Это дает вам класс Option по образцу scala.

require 'rumonade'

[nil, 1, 123].map { |v| Option(v) }
=> [None, #<Rumonade::Some:0x7f2589297768 @value=1>, #<Rumonade::Some:0x7f2589297740 @value=123>]

[nil, 1, 123].map { |v| Option(v).map { |n| n.to_s }.select { |s| s.size > 2 } }.flatten
=> ["123"]
1 голос
/ 28 сентября 2011

В adt библиотеке в examples/common_adts.rb есть пример класса Maybe.Есть и другие примеры ADT, и библиотека упрощает определение ваших собственных.

0 голосов
/ 13 мая 2016

Я только что нажал на гем под названием nil_be_gone , который дает вам опциональный объект, с которым вы можете обернуть объекты. Он реализует method_missing, чтобы проверить, имеет ли значение Optional значение nil, и, если это так, просто вернуть другое значение Optional, заключенное в ноль, в противном случае он вызывает метод объекта и переносит его снова.

nil_be_gone реализует bind как and_then, что позволяет вам связывать операции над необязательными типами, это методы возврата, которые извлекают значение из необязательного значения, а единичная операция, которая оборачивает объект в монаде, определяется self.from_value .

0 голосов
/ 22 июня 2011

Я не знаю Скала, поэтому не могу утверждать, что это ваш ответ:

В ruby, когда вы вызываете метод, вы можете определить значение по умолчанию для параметра:

def foo(i_am_mandatory, i_am_optionnal = :banga)
  puts i_am_optionnal
end

foo(:pouet, :plip)
=> :plip
foo(:pouet)
=> :banga

В этом примере вы можете опустить i_am_optionnal со значением по умолчанию.

НТН.

...