4

一部のJavaコードをScalaに変換する必要があります。私はそのような情報源を持っています。Scalaでそれを書き直す方法は?質問は簡単かもしれません。ただし、ドキュメントのfor(i <-1 until 10){}の例よりも一致しにくいです。

for (int i = password.length(); i != 0; i >>>=1)
  { some code }

キングよろしく、アレクセイ

4

4 に答える 4

6

できるだけ速くしたい場合(シフト操作が与えられた場合であると私は想定しています)、whileループを使用する必要があります。

var i = password.length()
while (i != 0) {
  // some code
  i >>>= 1
}

これは、Javaが同じ操作でScalaよりもコンパクトである数少ないケースの1つです。

末尾再帰を使用することもできます。

final def passwordStuff(password: Password)(i: Int = password.length): Whatever = {
  if (i != 0) {
    // Some code
    passwordStuff(password)(i >>> 1)
  }
}

これは、whileループと同じ速度でコンパイルされます(とにかく、ほとんどすべての場合)。

于 2012-05-08T21:11:13.287 に答える
2

エキゾチックな機能的な方法を探している場合は、次のように書くことができます。

Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=)

次のアクションを怠惰に実行します:パスワードの長さを初期値として取得し、{ => i >>> 1 }それに適用し、次の反復に渡し、適用します...パス、...

次に、計算のスコープを設定し、0に等しくない値のみに制限しました。

于 2012-05-08T23:27:15.053 に答える
1

i >>>=i /= 21は正の整数と同等です。

この知識と、 scalaのforループ(ループ変数)を5の累乗でインクリメントするための答えを組み合わせると、設定する必要があります。

于 2012-05-08T21:06:48.037 に答える
0

>>>=演算子を知りませんでした。もう少し機能的にしようとしましょう。foreachは関数A=>Unitを取ります。この場合、AはIntです。

def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++  breakdownBy2(from/2)
breakdownBy2(passoword.length).foreach(println(_))
于 2012-05-08T21:36:26.317 に答える