6

私はRubyを初めて使用し、最近、RubyonRailsアプリケーションを作成するときに値と比較する際に問題が発生しました。コントローラーで、常にfalseを返す次のステートメントがありました。

if (user.id != params[:id])

問題は、user.id(アクティブレコード)が整数であり、params [:id]が文字列であるということでした。これを理解するのに少し時間がかかり、ついに次のように変更しました。

if (user.id != params[:id].to_i)

これで、ステートメントは期待どおりに機能します。

将来このエラーを回避するために、2つの異なるタイプを比較しようとした場合に、Rubyに「コンパイル」または警告を表示させる方法はありますか?私が「コンパイルチェック」したい他のいくつかの問題に遭遇しました:

  • 変数を作成したが使用しない場合は警告します。変数名のタイプミスをチェックするのに役立ちます。
  • メソッドがクラスに存在することを確認して、メソッド名のタイプミスを回避し、たとえばメソッドの名前を変更した場合などにリファクタリングを支援できるようにします。

私は現在、Ruby1.8.6-27RC2とRails2.3.2およびRadRailsIDEをWindowsで使用しています。

4

6 に答える 6

5

最初にテストしてから、コーディングします。アプリケーションのすべてのブランチをカバーするテストを作成すると、コードが実行され、正しい結果が生成されることが保証されます。

編集:最後の1秒までメソッド名に依存しない2つのタイプを比較する機能などは、Rubyのコア機能であることを指摘しておく必要があります。

オブジェクトにメッセージを送信するほど、メソッドを呼び出すことはありません。次に、オブジェクトはメソッドの処理方法を理解する責任があります。Railsでは、これはActiveRecordのDB列にアクセスするために使用されます。列名のメッセージがオブジェクトに送信されるまで、列のメソッドはありません。

Rubyでの静的型付けは、ダックタイピングシステムに反します。多くの場合、複雑な継承/インターフェイススキームを気にすることなく、無料でポリモーフィズムを取得できます。

これらの機能を採用し、テストを通じて不確実性を補うことをお勧めします

于 2009-07-09T14:42:08.290 に答える
2

Rubyでは、Objectの==演算子を再定義することはできません。ruby 1.8ではできませんが、Ruby 1.9で実行できるはずでしたが、コアクラスでスクリプトを機能させることができませんでした。カスタム定義のオブジェクトに適しています。

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

私が愚かなコーディングエラーをしなかったと仮定すると、答えはノーです。異なるタイプのオブジェクトを比較しているかどうかを確認することはできません。

また、私はあなたがそうしないと言うでしょう。実際、Rubyはこのように機能するようには設計されていません。これは、RubyスタイルというよりもJavaのアプローチです。

于 2009-07-09T16:16:38.333 に答える
1

Rubyは安全ではないはずです。それはあなたがどんな2つのオブジェクトでも比較することを可能にします、そしてそれはその力の多くが由来するところです。このようなダイナミックなデザインがなければ、レールは実現できません。

JavaやCなどのコンパイル言語でさえ、2つのオブジェクトで==を実行することを妨げることはありません。ベンが言ったように、最初にテストするのが最善です。作業している構造を調べます。Rubyオブジェクトに関する情報を取得する1つの方法は、次を使用することです。

puts object.class
于 2009-07-09T14:47:46.843 に答える
1

一般に、動的/スクリプト言語のこのタイプの問題を回避するための(私が知っている)最善の方法は、「ロジック」をメソッド/コマンドに移動し、それらの単体テストを作成することです。基本的に、失敗する可能性のあるものはすべてテストする必要があります。ページのコードはダムロジックである必要があります...特定の条件を満たすアイテムのみを表示するのではなく、すべてのアイテムを表示し、表示する必要があるアイテムのみを返すメソッドからアイテムのリストを取得する必要があります。

于 2009-07-09T14:48:29.837 に答える
0

私が提案する2つのこと:

1つ:IRB(またはRailsの場合はスクリプト/コンソール)を読んでください。動的言語での一般的な開発方法は、「ライブ」インタープリター(IRBやRailsコンソールなど)内でコードのスニペットを試すことです。この方法は、SmalltalkやLispなどの最も初期の動的言語にまでさかのぼります。Rubyデバッグは、問題のトラブルシューティングにも非常に役立ち、例のエラーを理解するための非常に簡単な方法でした。

2:「ダックタイピング」を読んでください。「型」と変数の動作は、Rubyでは多くの人が期待するものとは少し異なります。私が理解しているように、user.idのような変数には「タイプ」がありません。user.idが指す値には型がありますが、変数自体にはありませ。これが、プログラムを実行する前にエラーが何であったかを教えてくれるツールがない理由の一部だと思います。変数には型がないため、これら2つの変数を比較してもエラーにはなりません。user.idはプログラムのその時点で整数を指していましたが、user.idを文字列を指すように割り当てることは完全に合法であり、その時点でその比較ははるかに理にかなっています。:-)

于 2009-07-13T01:33:36.933 に答える
0

私が見つけた最良の解決策は、RubyMineなどのオンザフライの構文チェックを行うIDEでした。それが私の元の問題を解決したかどうかはわかりませんが、他のいくつかの構文とコンパイルエラーを見つけて修正するのに役立ちました。みなさん、ありがとうございました。

于 2015-10-26T20:29:27.540 に答える