2016-12-27 8 views
0

私はコード演習としてCaesar Cipherを構築していました。私はコードスニペットをいくつか見つけ出していますが、なぜ動作するのか分からず、誰かが作品ごとに作品を説明できるかどうか疑問に思っていました。これはRubyの初心者が実際のコードの実装を説明することでさまざまなタイプのコードのビルディングブロックを理解するのに役立ちます。Ruby Caesar Cipherの説明

caesar_string = ""

  • 文字列の各文字を反復(string.each_charが、今日好ましいであろうことに注意してください):

    def caesar_cipher (string, number) 
        caesar_string = "" 
    
        string.scan (/./) do |i| 
         if ("a".."z").include? (i.downcase) # Identify letters only. 
         number.times {i = i.next} 
         end 
         caesar_string << i[-1] 
        end 
        return caesar_string 
    
    
        end 
    
    
        print "What would you like to encrypt?" 
        text = gets.chomp 
    
        puts caesar_cipher(text, 5) 
    
  • +0

    あなたはどちらの部分を理解していませんか? –

    +0

    より良い方法は 'string.gsub(/ [a-z]/i){| s | (s.ord + number).chr} 'となります。 – sawa

    +0

    @sawa。あなたの「より良い」方法は、「z」から「a」に再びループしないという欠点があります。上記のコードで 'W' + 5が' B'であれば、あなたのコードで '\\'になります。 –

    答えて

    2
    1. 空の文字列を初期化します。ここでは

      はコードがあります:

      string.scan (/./) do |i|

      すべてのRubyスタイルガイドは、メソッド呼び出しと開始括弧の間のスペースを避けることに注意してください。

    2. 各文字について、その小文字が "a"から "z"の範囲にあるかどうかを確認します。

      if ("a".."z").include? (i.downcase)

      ループの外側にその範囲を規定することに注意してください(これは反復ごとに使い捨て範囲オブジェクトを生成回避するので、すなわちLOWERCASE_LETTERS = ("a"..."z")は、良いだろう)。

    3. シフト手紙number回:

      number.times {i = i.next}

      これは"a".next == "b"ので同じはいえ、すべての反復なし(i.ord + number).chrのようなもので達成されている可能性が動作します。

    4. 文字は、以前に初期化されたcaesar_stringに追加されます。

      caesar_string << i[-1]

      著者は"z".next == "aa"以降の文字列([-1])の最後の文字を使用しています。

    5. 文字列が返されます。

      return caesar_string

      ここreturnの使用が不要と慣用ないの両方であることに注意してください。

    +0

    これは非常に役に立ちました!ありがとうございました! – davidtaylorjr

    +0

    ポイント5は '' z'.next#=>'aa''などのためです –

    +0

    ああ、もちろんです。 :) –

    2
    string.scan (/./) 
    

    作成し、各文字の配列を文字列にして、各文字を反復します。

    if ("a".."z").include? (i.downcase) 
    

    上記のステートメントは、アルファベットの文字の配列を作成するRangeを使用し、方法が唯一のアルファベットの文字をシフトし、シフトすべきではない数字や句読点をスキップすることができます。

    number.times {i = i.next} 
    

    これは、文字を右に5回シフトします。 ii.next"ae"を返します"z"ある場合はしかし、その次の行

    caesar_string << i[-1] 
    

    は「」このエッジケースのオフ文字列とカットで唯一の最後の文字になります。

    ほとんどの場合、iは1文字で、[-1]は唯一の文字なので、どちらの場合でも機能します。 <<オペレータは、文字を末尾にcaesar_stringにシャベルして、一度に1文字ずつ文字を再構築します。 string.scan (/./) do |i|ブロックが終了すると

    return caesar_string 
    

    caesar_stringが返されます。

    関連する問題