Как мне настроить необязательное значение в ruby? Scala имеет опцию [], и это то, что я ищу в ruby.
Есть ли эквивалент ruby для опции Scala?
Ответ 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, который имеет значение по умолчанию.
НТН.