i.toString
関数のこの単純な定義でどうにかしてキャッシュできますか?
def palindrome(i: Int) = i.toString == i.toString.reverse
この関数をシンプルに保ち、古典的な複数行の中括弧で囲まれた関数を使用したい..
i.toString
関数のこの単純な定義でどうにかしてキャッシュできますか?
def palindrome(i: Int) = i.toString == i.toString.reverse
この関数をシンプルに保ち、古典的な複数行の中括弧で囲まれた関数を使用したい..
Scala には従来の関数型言語のような let ステートメントがありませんが、それは主に val + 波括弧が同じ目的を果たしているためです。複数行の部分または中括弧全般に反対していますか? 打ち負かすのはかなり難しいので:
def palindrome(i: Int) = { val s = i.toString; s == s.reverse }
中括弧を省略しようとしても、文字数が増えるだけです。
あなたがすることができます:
def palindrome(i: Int) = ((s:String) => s == s.reverse)(i.toString)
次の前方パイプ演算子を使用します。
scala> implicit class PipedObject[A](value: A) {
| def |>[B](f: A => B): B = f(value)
| }
defined class PipedObject
scala> def palindrome(i: Int) = i.toString |> (s => s == s.reverse)
palindrome: (i: Int)Boolean
これにより問題がエレガントに解決されますが、署名をpalindrome
からpalindrome(Int)
に変更してpalindrome(String)
で呼び出すpalindrome(i.toString)
(名前を に変更するisPalindrome
) ことをお勧めします。
ワンライナーですが、ブレースはまだここにあります。ただし、私には短いようです:
def palindrome(i: Int) = { val s = i.toString; s == s.reverse }
そのような関数がたくさんある場合は、次のようなこともできます。
@inline def let[T, R](expr: =>T)(body: T => R): R = body(expr)
def palindrome(i: Int) = let(i.toString) { s => s == s.reverse }