私はscalaを学び始めています。以下のコードをより機能的な方法で書き直すより良い方法があるかどうか疑問に思います。私は1つがあるに違いないことを知っています。
val buf = ((addr>>24)&0xff) + "." + ((addr>>16)&0xff) + "." + ((addr>>8)&0xff) + "." + ((addr)&0xff)
私はscalaを学び始めています。以下のコードをより機能的な方法で書き直すより良い方法があるかどうか疑問に思います。私は1つがあるに違いないことを知っています。
val buf = ((addr>>24)&0xff) + "." + ((addr>>16)&0xff) + "." + ((addr>>8)&0xff) + "." + ((addr)&0xff)
val buf = List(24,16,8,0).map(addr >> _).map(_ & 0xff).mkString(".")
ブライアンの答えに似ていますが、値の短いリストと、Scalaの有名な「_」演算子を使用した2つの単純な map() メソッドを使用して、これを行う方法を次に示します。素晴らしい質問です。
for 内包表記の方が少し読みやすいと感じる人もいるでしょう:
(for (pos <- 24 to 0 by -8) yield addr >> pos & 0xff) mkString "."
利点は、入力 - 任意の数の整数にすることができることです
// trick
implicit class When[F](fun: F) {
def when(cond: F => Boolean)(tail: F => F) = if (cond(fun)) tail(fun) else fun
}
// actual one-liner
12345678.toHexString.when(1 to 8 contains _.length % 8)
(s => "0" * (8 - s.length % 8) + s ).reverse.grouped(2).map
(Integer.parseInt(_, 16)).toList.reverse.mkString(".")
// 0.203.22.228
// a very big IPv7
BigInt("123456789012345678901").toString(16).when(1 to 8 contains _.length % 8)
(s => "0" * (8 - s.length % 8) + s ).reverse.grouped(2).map
(Integer.parseInt(_, 16)).toList.reverse.mkString(".")
// 0.0.0.96.27.228.249.24.242.99.198.83
編集
反対票のための説明。implicit class When
単なるライブラリ クラスにすることができ、動作し2.10
、コール チェーン内の関数の一部を条件付きで実行できます。私はパフォーマンスを測定しませんでしたし、気にしません。なぜなら、例自体は、エレガントかどうかにかかわらず、何が可能かを説明するためのものだからです。