4

Java のバックグラウンドを持つ私は、Ruby のメソッド パラメータに対する完全に無礼な態度に少し動揺しています。Java では、パラメーター x がメソッドが適切に機能するために必要な型であることを保証できましたが、Ruby では、x が整数、文字列、またはそれ以外のものであることを保証する方法がありません。

例: Java で absolute_value メソッドを記述したい場合、ヘッダーは次のようになります。

public static int absoluteValue(int x)

Rubyでは、次のようになります

def self.absolute_value(x)

この例では、Java コードで、渡されるパラメーターが「Happy Birthday!」ではないことを完全に確信できます。しかし、Ruby コードではそれがわかりません。実行時にコードがクラッシュしないように、Ruby でこの状況を防ぐにはどうすればよいですか?

4

5 に答える 5

4

Ruby、Kvassへようこそ。うまくいけば、あなたはダックタイピングを愛することを学ぶでしょう。型のチェックやコンパイルに依存せずに、テストを作成することで、Rubyのコードに自信を持てるようになります。タイプを定義する必要がないため、速度、柔軟性、および読みやすさが向上します。

于 2011-06-08T04:03:15.787 に答える
4

ルビーへようこそ。私も過去数年間 Java で働いていましたが、当時は Java が大好きでした。

さて、Ruby に型チェックが欠けていると考えるのは正しくありません。少なくとも Java と同じくらい多くの型チェックが行われます。型の変更が許可されているため、チェックは実行時に行われます。

さらに、古い言語での宣言のボイラープレートを押しつぶすことは面倒です。型チェックされたアプリケーションが時間内に完成しないと便利ではありません。冗長すぎて読めない型チェック済みプログラムは、時代遅れになる可能性があります。

また、Ruby プログラムを最初に実行したときに型がチェックされない場合は、テストでカバーされる可能性があります。

しかし、それをテストしないと、それが機能するかどうかわからないため、メソッド呼び出しの型が準拠しているという抽象的な知識は、想像するほど役に立ちません。

いずれにせよ、Ruby は言語として、この時点でかなりうまく機能していることが証明されています。実際のプラットフォームとして、RoR は速度とメモリ使用量の両方でパフォーマンスに問題がありますが、動的型付けに不満を持ち、古い冗長な言語で RSI を取得するのに苦労していることを望んでいるプロジェクトを私は知りません。

于 2011-06-08T04:33:52.790 に答える
2

生きたいなら一緒に来てください。

a="String"
puts a.kind_of? Integer  # false
puts a.kind_of? String   # true

a=10
puts a.kind_of? Integer  # true
puts a.kind_of? String   # false
于 2011-06-08T04:51:57.240 に答える
1

Ruby は (ほとんど?) 常に解釈されるため、メソッド ヘッダーで指定された型チェックは実行時にクラッシュします。「ダックタイピング」動作 (処理対象のオブジェクトが正しいメソッドを持っているかどうかを操作タイプがチェックする) は、Ruby のイディオムの一部であり、Ruby で Java を記述しようとするべきではありません。代わりに Ruby コードの書き方を学びましょう。

于 2011-06-08T03:59:03.357 に答える
0

ダックタイピングを維持しながら、最小限のレベルのメソッドテストを行うことができます。本「The ruby​​ programming language」の例を使用するには

def +(other)
  raise TypeError, "Point-like argument expected" unless other.respond_to? :x and other.respond_to? :y
  Point.new(@x + other.x, @y + other.y)
end

この例は、(x,y) 座標で動作する Point クラスに "+" 操作を実装するために使用されます。other.is_a?(Point) を実行するのではなく、メソッドの実装をテストしましたが、これは私にとっては良い選択肢のようです。「他の」オブジェクトには、別の意味を持つ x 属性と y 属性がある可能性があると主張することができますが、正しい議論は、私がちょうど中間点を指しているという点を見逃しています。私のアプローチは、追加を直接行い、誰かが間違った型を渡した場合に失敗することにも傾いています。

于 2012-01-17T11:52:49.977 に答える