2013-07-16 31 views
8

PHP Ví dụ:Ruby có hỗ trợ loại gợi ý không?

function do_something(int $i) { 
    return $i + 2; 
} 

của Ruby Ví dụ:

class MyClass 
    # ... 
end 

def do_something(MyClass x) 
    x.prop1 = "String..." 
end 

Có bất cứ điều gì tương tự như này? Cảm ơn.

+2

lưu ý rằng php chỉ hỗ trợ nhập kiểu mảng và đối tượng. '(int $ i)' thật không may là không thể. Btw tại sao các downvotes ở đây? Đối với tôi, với tư cách là một nhà phát triển PHP, điều này thú vị – hek2mgl

+0

Xin lỗi, bạn có gì không? PHP không hỗ trợ loại hình vô hướng mà không có tiện ích mở rộng của bên thứ ba – Hast

+1

@ Rất tiếc, không phải là – hek2mgl

Trả lời

3

Ruby không có điều đó, nhưng tất cả những gì bạn phải làm là thêm một dòng như sau:

def do_something(x) 
    raise "Argument error blah blah" unless x.kind_of?(MyClass) 
    ... 
end 

Không phải là vấn đề lớn. Nhưng nếu bạn cảm thấy nó quá dài dòng, sau đó chỉ cần xác định một phương pháp:

module Kernel 
    def verify klass, arg 
    raise "Argument error blah blah" unless arg.kind_of?(klass) 
    end 
end 

và đưa rằng trong dòng đầu tiên:

def do_something(x) 
    verify(MyClass, x) 
    ... 
end 
+1

Đối với các tài liệu như yard, rdoc, có một cú pháp đặc biệt để chỉ định lớp của các đối số. – sawa

+6

thật buồn cười "tất cả những gì bạn phải làm là viết một ngoại lệ tùy chỉnh cho mỗi tham số trên mọi chức năng gọi" Tôi thực sự phải cười :). Tôi không biết ruby ​​là rác tinh khiết cho đến khi tôi phát hiện ra không có loại gợi ý. Bây giờ tôi sẽ không bận tâm với ngôn ngữ đó cho chắc chắn – Toskan

+4

Ngoài các mối quan tâm thẩm mỹ, điều này không phải là ngữ nghĩa tương đương với loại gợi ý. Quan trọng, đây là kiểm tra _runtime_, so với loại gợi ý, cho phép kiểm tra _static_. I E. Tôi có thể kiểm tra tất cả các đường dẫn mã ngay lập tức mà không phải chạy chúng. Tôi không cố gắng để thùng rác Ruby, chỉ cần chỉ ra kiểm tra kiểu thời gian chạy không tương đương. Điều này chỉ tương đương với phạm vi kiểm tra đầy đủ (ngoài "chỉ 100% mức độ phù hợp": nó phải kiểm tra mọi thuật toán mã hóa, nhiều hơn là chỉ nhấn từng dòng cú pháp). đó là ... khá là "một vấn đề lớn": P – hraban

3

Nếu bạn thực sự muốn chắc chắn một hành động nào đó được thực hiện trên một thể hiện của một lớp cụ thể (như một số nguyên), sau đó xem xét việc xác định hành động mà trên lớp học cụ thể:

class Integer 
    def two_more 
    self + 2 
    end 
end 

3.two_more #=> 5 
2.0.two_more #=> undefined method `two_more' for 2.0:Float (NoMethodError) 

class MyClass 
    def do_something 
    self.prop1 = "String..." 
    end 
end 
+2

Chỉ hoạt động với tham số * one * "(người nhận), do công văn đơn lẻ .. – user2246674

1

Không, Ruby tự nó không hỗ trợ nó, và tôi nghĩ đó không phải là ý định của Matz để thêm nó vào ngôn ngữ ... Ruby thực sự nắm lấy duck typing trong API nội bộ của chính nó và nó làm cho Ruby một ngôn ngữ rất năng động và hiệu quả ...

+9

Đó là tất cả tốt và tốt cho đến khi bạn nhận được để hệ thống phức tạp và cho biết đối số cần phải phù hợp với một thực hiện nhất định. Ruby, như một ngôn ngữ tuyệt vời như nó - thực sự có thể làm với một tính năng như vậy. Đó là một tính năng tuyệt vời của một số ngôn ngữ OO tốt nhất :) – Oddman

2

Shameless plug - Tôi vừa xuất bản đá quý ruby ​​cho điều này - http://rubygems.org/gems/type_hinting

Cách sử dụng ở đây - https://github.com/beezee/ruby_type_hinting

Tôi đã tìm nó trước và tìm thấy chủ đề này. Không thể tìm thấy những gì tôi đang tìm kiếm vì vậy tôi đã viết nó và figured tôi muốn chia sẻ ở đây.

Tôi nghĩ nó ngắn gọn hơn bất kỳ giải pháp được đề xuất nào ở đây và cũng cho phép bạn chỉ định kiểu trả về cho một phương thức.

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