錆,反復子およびスキル回帰


カバースプラッシュマシューヘンリーによって.
私たちの犬の訓練のインストラクターは、状況は犬が3 Dのに基づいて処理するために難しくなることを教えた:あなたからの距離、気晴らし、活動の期間.あなたはこれらの3つのDのいずれかを増加させるように、あなたのペットとハードに働いているこれらの高レベルのスキルは、難しくなると、彼らはあまりにもハードに管理するためになると、彼らはスキルのより簡単なレベルに取り戻す.彼らがかかとができないならば、多分、彼らは座ることができます.そして、彼らが座ることができないならば、多分、彼らは私を見て扱うことができるか、少なくとも、私が投げている処置を見つけることができます.
これは私の脳がどのようにコードの問題を処理するかについてのようです.3 Dの代わりに、私は3 Lの:言語、論理、フォーカスのレベルがあります.私が私がスーパー快適な言語で働いているならば、私がしようとしていることの論理は簡単です、そして、私は十分な食物/睡眠/コーヒー/静かな/非不安を持ちました、私はかなりの、読みやすい、慣用的なコードを思い付くことができるという事実をかなり誇りに思います.しかし、私が慣れていない言語で働くとき、何かの論理はもう少し複雑です、あるいは、私は焦点の戻り点を越えていません.
有線
return [value*2 for value in values]
疲れました.
result = []
for value in values:
    result.append(value * 2)
焼成
result = []
for i in range(len(values)):
    result.append(values[i] * 2)
そして、それは通常、進行がどのように行くかです:
  • 滑らかな言語固有のトリック/builtin/標準ライブラリモジュールを知っている私の問題を簡潔かつ明確に解決することができますか?
  • 私が欲しいものをすることができるサードパーティライブラリを知っていますか(そして、私は、そのライブラリをインポート/インストール/使用のコストでokですか?)?
  • 晴れ.我々はそれをハードの方法を行います.私は、ループのためにすべての価値を通します.
  • OK、それは動作しないか、あまりにも複雑です.私はいくつかのヘルパー変数を追加し、私のループをより詳細にするが、それぞれの行に簡単です.
  • OK、あなたは何を知っていますか?それをねじってください.私は核に行って、整数インデックスに頼ります.
  • とにかく、私がさらに快適にゾーンを歩きながら、私はインデックスによってコレクションをループしてしまう.なぜ?それは通常、すべての言語では、かなり一貫性のある動作ですので、それは動作し、それはバグが鈍いと読むのは難しいではない(少なくとも、私はこの深い、暗い場所にいるとき私は自分自身を納得させるものです).
    だから、いつでも私は、はしごを私の方法を見つけることができる、それは本当に良い感じと私は何か良いことを学んでいることを意味します.それは昨日私に起こった.私が解決しようとしていた問題は(主な問題の小さな問題です).

    Decide whether or not a string has a set of double-letters (e.g. ll, rr, aa, ee).


    十分簡単です.私は、各連続ペアを比較したい!しかし、私は少し疲れました、そして、私はさびに取り組んでいました.私は梯子の底を右から始めた.
    fn has_double(s: &str) -> bool {
        for i in 0..s.len() {
            if i == s.len() - 1 {
                return false;
            }
            if s[i] == s[i + 1] {
                return true;
            }
        }
    
        false
    }
    
    きれいではない.わかってる.また、動作しません.
    そうですね.さびがストリングを責任を持って扱うという事実のために、それは生のストリングの真ん中の一つの文字にインデックスをつけるのが残念で、つまずくほど難しいです.UTF - 8/ASCII/encodingの理由について.これは実際には良い責任を負うものです.しかし、それは私のコードが動作しないことを意味します.
    それから、私のサーチエンジンの周りで、タブを開いて右側に進み、ある答えを探していたのですが、誰かがカーテンを持ち上げたように、すべてをはっきりさせていたのではない.
    そして、私のPython脳は、私の汚い小さいさび脳(私の既存のものからの少しの援助でなく形のルビー脳からの少しの援助で)に点火されて、接続しました、そして、ギアは噛み合いました、そして、私は現れました
    fn has_double(s: &str) -> bool {
        s.chars().zip(s.chars().skip(1))
            .any(|(a, b)| a == b)
    }
    
    はい!いつでもアイテムをインデックスすることはできませんインデックスを、それはほとんど常にクリーナーと少ないエラーがちです.この場合、私は4つの素晴らしいイテレータメソッドを使用しています.
  • chars :文字列を文字のイテレータに変換します.
  • zip :並列に2つ以上のイテレータを反復処理する.複数のコレクションまたは同じコレクションのビューを同時に実行しようとすると、ほぼ常に正しい選択.これは、任意のコレクションを実行するときに、我々はインデックスのエラーを避けるために、私たちのオフに役立ちます停止します.
  • skip :我々のイテレータを1つ前のアイテムにスキップして、他のものの前にある.これは、zipの“停止最短”の動作に関連付けられて我々が必要なものを私たちに与える.
  • any :ラムダ/匿名関数の引数がtrueを返す原因となるケースの任意のインスタンスに対してイテレータを検索します.それは余分な素晴らしいですので、ショートは、それが真を見つける場合.
  • それで、私がこれをストリング"banana"で走らせるとき:
    ba
    an
    na
    an
    na
    # => false
    
    しかし、私が"apple"で実行するとき:
    ap
    pp
    # => true
    
    そして、私の信頼は、人類、私自身で復元され、私は実際に私はこのコードを書いているいくつかの錆を学んでいる.私は、この点で、さびがパイソンのようであることがうれしいです.

    If you’re trying to iterate using indices, you’re probably not doing it the Rusty way. There’s probably a better way, and it’s probably a slick combination of shwoopy iterator methods.