2011-06-22 30 views
12

Làm cách nào để tạo mô hình một giá trị tùy chọn bằng ruby? Scala có Option [], đó là những gì tôi đang tìm kiếm trong ruby.Có tương đương ruby ​​với Tùy chọn Scala không?

+0

Giá trị tùy chọn là gì? –

+0

Đá quý rumonade có một tùy chọn giống như rubala cho ruby: https://github.com/ms-ati/rumonade –

+0

Bạn cũng có thể kiểm tra đá quý monadic mà thực hiện các đơn nguyên có lẽ, đó là tương đương với tùy chọn của Scala - https: //github.com/pzol/monadic –

Trả lời

5

Không tương đương với thư viện chuẩn. Bạn phải định nghĩa của riêng bạn. Xem this article.

+0

Đó là điều tôi sợ. Xác định hoạt động của riêng bạn tốt, nhưng việc sử dụng thư viện/bulitin dễ dàng hơn. Cảm ơn bạn. – ladrl

+0

Bạn không nên cần nó mặc dù http://stackoverflow.com/questions/5839697/why-is-the-use-of-maybe-option-not-so-pervasive-in-clojure – OscarRyz

+2

@OscarRyz: Tôi đồng ý rằng các loại là một khía cạnh quan trọng trong lập trình bậc cao hơn, nhưng nó là hoàn toàn có thể và chính đáng để làm lập trình bậc cao hơn mà không có các loại. Các loại không phải là phần tử _mandatory_ ở đây. Monads có liên quan đến cả ngôn ngữ tĩnh lẫn ngôn ngữ động (Xem minikanren của Clojure cho một ví dụ tuyệt vời). Tùy chọn là một đơn nguyên. Ngoài việc cung cấp một loại an toàn tốt hơn, nó có một số lợi ích, chẳng hạn như cắt giảm bản mẫu lò hơi và đồng thời đảm bảo rằng tất cả các trường hợp có thể đã được xử lý. [..] – missingfaktor

-8

Tôi không biết Scala, vì vậy tôi không thể khẳng định đó là câu trả lời của bạn:

Trong ruby, khi bạn gọi một phương thức, bạn có thể xác định một giá trị mặc định cho một param:

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

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

Trong ví dụ đó, bạn có thể bỏ qua i_am_optionnal, có giá trị mặc định.

HTH.

+1

Đó không phải là điều mà 'Tùy chọn' đơn thuần dành cho. – missingfaktor

+0

Đó là rủi ro… Cảm ơn bạn đã chính xác nó :) – ook

4

Tôi không phải là chuyên gia về Ruby, nhưng tôi không nghĩ có Tương đương tùy chọn. Khi Ruby định hướng đối tượng, không có gì ngăn bạn viết việc triển khai của riêng bạn, nhưng nó sẽ không hữu ích như trong ngôn ngữ được gõ tĩnh, nơi mà lực biên dịch buộc bạn thực hiện kiểm tra thích hợp cho tùy chọn trống. các điểm chính để sử dụng cấu trúc này. Tất nhiên có những ưu điểm khác, như khả năng chuỗi giá trị Option theo nhiều cách.

2

Bạn đã xem đá quý Rumonade chưa? Nó cung cấp cho bạn một lớp Option được mô hình hóa trên 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

Có một ví dụ về một lớp Maybe trong nkpart của adt library dưới examples/common_adts.rb. Ngoài ra còn có các ADT ví dụ khác và thư viện giúp bạn dễ dàng xác định hơn.

0

Tôi vừa mới đẩy một viên đá quý được gọi là nil_be_gone cho bạn tùy chọn mà bạn có thể bao bọc các đối tượng. Nó thực hiện phương thức method_missing để kiểm tra xem giá trị của tùy chọn là nil và nếu chỉ đơn giản là trả về một giá trị nil bọc không bắt buộc khác, nếu không nó sẽ gọi phương thức trên đối tượng và kết thúc nó một lần nữa.

nil_be_gone thực hiện bindand_then cho phép bạn chuỗi hoạt động trên các loại tùy chọn, đó là phương thức trả về lấy giá trị từ giá trị tùy chọn và thao tác đơn vị bao bọc đối tượng trong đơn lẻ được xác định bởi self.from_value.

Các vấn đề liên quan