2013-07-16 4 views
8

PHP例:Rubyはタイプヒントをサポートしていますか?

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

ルビー例:

class MyClass 
    # ... 
end 

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

は、次のようなものはありますか?ありがとう。

+2

phpは配列とオブジェクトの型ヒントのみをサポートしています。 '(int $ i)'は残念ながら不可能です。 Btwなぜここにdownvotes? PHPデベロッパーとして私にとっては、これは面白いです – hek2mgl

+0

何をすべき? PHPはサードパーティの拡張機能を持たないスカラー型のヒントをサポートしていません – Hast

+1

@Hast残念ながら – hek2mgl

答えて

3

そのようなものですが、あなたがしなければならないのは、次のように1行追加するだけです。

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

大したことではありません。しかし、あなたはそれがあまりにも冗長であると感じた場合には、単に方法を定義:

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

をし、最初の行にすることを置く:

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

yard、rdocなどのドキュメントについては、引数のクラスを指定する特別な構文があります。 – sawa

+6

それは私が本当に笑っていた:)「あなたがしなければならないすべては、すべての関数呼び出しに各パラメータのカスタム例外を作成している」おかしいです。私はタイプヒントがないことがわかるまで、ルビーが純粋なゴミであることを知らなかった。今、私は別に美的懸念から、これはタイプヒンティングと意味的に等価ではないことを確認 – Toskan

+4

のためにその言語を気にしません。重大なことに、これは、タイプスタイリングを可能にするタイプヒントと比較して_runtime_チェックです。私。私は、コードパスを実行することなく、すぐにすべてのコードパスをチェックすることができます。私はRubyをゴミ箱に入れようとしているわけではなく、単に実行時の型チェックが同じではないことを指摘しています。これは、完全なテストカバレッジを持つ唯一の等価です(ただ、「100%の範囲」を超えた:それはちょうどすべての構文行を打つよりもあるすべてのコードパスをテストする必要があります)。それはだ...かなり「大した」:あなたは複雑なシステムを取得し、引数が特定の実装に合わせて、必要があると述べまですべてが順調と良いのP – hraban

3

あなたが本当に特定のアクションを(整数のような)特定のクラスのインスタンス上で実行され、その後、特定のクラスにそのアクションを定義することを検討確認するには:

Rubyはありません
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

シングルディスパッチのため、* one * "パラメータ"(受信者)にのみ有効です。 – user2246674

1

いいえ、ルビー自体がそれをサポートしていない、と私は考えますそれはMatzを言語に追加する意図ではありません。Rubyは実際にはduck typingを独自の内部APIに包含しており、Rubyは非常に動的で生産的な言語になっています...

+9

。 Rubyは偉大な言語であり、実際にこのような機能を持つことができます。それはいくつかの最高のオブジェクト指向言語の素晴らしい機能です:) – Oddman

2

恥知らずのプラグインこれのルビーの宝石 - http://rubygems.org/gems/type_hinting

使用方法はこちら - https://github.com/beezee/ruby_type_hinting

私はまずそれを探して、このスレッドを見つけました。私が探していたものを見つけることができなかったので、私はそれを書いて、ここで分かち合うと思った。

ここで提案されているソリューションよりも簡潔であり、メソッドの戻り値の型を指定することもできます。