3

私はruby(java / groovyのバックグラウンドを持っています)を学んでいます。メソッドを書くとき、メソッドのシグネチャは次のようになります。

def method_name
    # do something
end

rubyの動的な性質により、return型が明示的に宣言されていない理由を理解しています。しかし、私がと呼ばれるメソッドを持っているとしましょうget_name。コードの呼び出し元として、文字列を返すのか、カスタムの名前タイプを返すのかわからない場合があります。戻り型を明示的に宣言する方法はありますか?そして(可能であれば)これは、戻り値が何であるかを明確にするために、本当にルビーで行われたことがありますか?

4

5 に答える 5

7

2019年の更新:静的型付けや型注釈はまだrubyに組み込まれていませんが、サードパーティの型チェッカーがあります。詳細については、この回答を参照してください。


Javaは静的型チェックを実行します。コンパイル時に、すべてのタイプ要件が満たされていることを確認します。Rubyはより動的で、コンパイル時のチェックを行わず、その型システムは「ダックタイピング」と呼ばれることがよくあります。つまり、「アヒルのように歩き、アヒルのように鳴くなら、それはアヒルでなければならない」ということです。

メソッドが特定のメッセージに応答する(特定のメソッドを持つ)オブジェクトを予期している場合、プロトコルに準拠している限り、オブジェクトの実際のタイプは関係ありません。これが優れたテストスイートによってバックアップされている場合は、プロトタイピングを高速化し、視覚的な混乱を減らすことができるため、(おそらく)より良い方法です。視覚的な混乱が少ない-コードはより表現力があり、理解しやすいものです。その利点は明らかです。:)

于 2012-06-23T14:22:45.850 に答える
1

簡単な答えはこれです:それは不可能であり、決して可能になることはありません。そして、それは決して使用されません。

長い答えは次のとおりです。Rubyは型を操作しません。Rubyは汎用オブジェクトを操作します。ある時点で、すべてがただのBasicObject。Rubyは、コア原則を持つDuckTypeingを使用します

アヒルのように歩き、アヒルのように話す場合、通訳は喜んでアヒルとして扱います。

Object#class(オブジェクトのクラスを返す)とでクラスをチェックできますがObject#is_a?(klass)、コミュニティによって強く推奨されていません。論理的に考え、ソースコードを読み、ドキュメントを使用してください。

于 2012-06-23T14:21:34.847 に答える
1

これには、RubyMine / IntelliJ が提供するコメント アノテーションが非常に役立つことがわかりました。例えば:

# @param [String] time_zone_offset_string eg. +10:00
# @return [Array] An array containing sign, hours and minutes
def self.parse_timezone_string(time_zone_offset_string)
  ... parse the timezone string ...
  return [sign, hours, minutes]
end

これらの注釈はRDocの機能ではないようです- もしあれば素晴らしいことです。

于 2014-11-27T23:40:12.423 に答える
0

私の知る限り、rubyがメソッドの戻り値の型を定義することは不可能です。しかし、is_a?などのメソッドを使用できますか?またはタイプをチェックするクラス。

于 2012-06-23T14:20:45.653 に答える