1. ホーム
  2. ruby

[解決済み] Ruby初心者が注意すべきRuby Gotchasとは?[クローズド]

2022-10-15 20:30:39

質問

私は最近Rubyというプログラミング言語を学びましたが、全体としては良い言語だと思います。 しかし、思っていたほど簡単ではなかったので、とても驚きました。 より正確には、quot;最小驚きの法則は、私にはあまり尊重されていないように見えました(もちろん、これはかなり主観的なものです)。 たとえば

x = true and false
puts x  # displays true!

と有名な

puts "zero is true!" if 0  # zero is true!

Rubyの初心者に警告するような、他のquot;Gotchas"は何ですか?

どのように解決するのですか?

ウィキペディアのRubyのゴチャゴチャ

記事より。

  • 大文字で始まる名前は定数として扱われるため、ローカル変数は小文字で始める必要があります。
  • 文字 $@ はPerlのように変数のデータ型を示すのではなく、スコープ解決演算子として機能します。
  • 浮動小数点数を表すには、その後にゼロ桁の数字 ( 99.0 ) または明示的な変換 ( 99.to_f ). ドットを付けるだけでは不十分です( 99. を付加することはできません。数値はメソッド構文に影響されやすいからです。
  • ブール値でないデータのブール値評価は厳密です。 0 , ""[] はすべて true . C言語では,式 0 ? 1 : 0 は次のように評価されます。 0 (すなわち偽)と評価される。しかし,Rubyでは 1 と評価され,すべての数値が true と評価されます。 nilfalsefalse . このルールの帰結として、Ruby のメソッド、例えば正規表現による検索は、成功すると数値、文字列、リスト、その他の偽でない値を返しますが nil を返します。この慣習はSmalltalkでも使われていて、特殊なオブジェクトである truefalse はブール式で使用することができます。
  • 1.9 より前のバージョンでは、文字データ型がありません (C 言語では char を提供しています)。これは、文字列をスライスする際に驚きをもたらすかもしれません。 "abc"[0]97 (文字列の最初の文字の ASCII コードを表す整数); を得るために "a" を使う "abc"[0,1] (長さ 1 の部分文字列) または "abc"[0].chr .
  • 表記方法 statement until expression は、他の言語の同等のステートメント(例えば do { statement } while (not(expression)); C/C++/...) と違って、式がすでに true . これは statement until expression を超える構文上の糖だからです。

    until expression
      statement
    end
    
    

    であり,C/C++でこれに相当するのは while (not(expression)) statement; と同じように statement if expression と同じです。

    if expression
      statement
    end
    
    

    ただし、表記は

    begin
      statement
    end until expression
    
    

    は、たとえ式がすでに真であっても、Rubyでは実際にその文を一度実行します。

  • 定数はオブジェクトへの参照であるため、定数が参照するものを変更すると警告が発生しますが、オブジェクト自体を変更すると警告は発生しません。例えば Greeting << " world!" if Greeting == "Hello" はエラーや警告を発生させません。これは、次のように似ています。 final 変数に似ていますが、RubyにはJavaと異なり、オブジェクトをフリーズさせる機能があります。

他の言語と顕著に異なるいくつかの特徴。

  • 条件式のための通常の演算子。 andor は、通常の優先順位の規則には従わない。 and よりもタイトにバインドされません。 or . Ruby には式演算子もあります ||&& であり、期待通りに動作します。

  • def 内部 def は、Pythonプログラマーが期待するようなことはしません。

    def a_method
        x = 7
        def print_x; puts x end
        print_x
    end
    
    

    に関するエラーが発生します。 x が定義されていないというエラーが発生します。そのため Proc .

言語機能

  • メソッドが複数のパラメータを取る場合、メソッド引数の周りの括弧を省略すると予期しない結果になることがあります。Ruby 開発者は、将来の Ruby バージョンでは複数パラメータを持つメソッドでの括弧の省略を認めない可能性があると述べています。 () を省略しないよう促す警告が出ます。を使わないで () というメソッドとともに、人間が読めるドメイン固有プログラミング言語としてのRubyそのものを使うのは、特に素晴らしいことです。 method_missing() .