Подтвердить что ты не робот

Есть ли эквивалент ruby ​​для опции Scala?

Как мне настроить необязательное значение в ruby? Scala имеет опцию [], и это то, что я ищу в ruby.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Вы проверили Rumonade gem? Он дает вам класс 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"]

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

НТН.