我可以以某种方式缓存i.toString
这个简单的函数定义吗?
def palindrome(i: Int) = i.toString == i.toString.reverse
我想保持这个功能简单,没有经典的多行,大括号封闭的功能..
我可以以某种方式缓存i.toString
这个简单的函数定义吗?
def palindrome(i: Int) = i.toString == i.toString.reverse
我想保持这个功能简单,没有经典的多行,大括号封闭的功能..
你可以这样做:
def palindrome(i: Int) = ((s:String) => s == s.reverse)(i.toString)
好吧,Scala 没有像一些传统函数式语言那样的 let 语句,但这主要是因为 val + 大括号实现了相同的目的。您是反对多行部分还是反对大括号?因为它很难被击败:
def palindrome(i: Int) = { val s = i.toString; s == s.reverse }
尝试省略大括号可能只会增加字符数。
使用正向管道运算符:
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
frompalindrome(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 }
开始Scala 2.13
,标准库提供了链接操作pipe
,可用于转换/管道i.toString
检查字符串是否为回文的函数:
import scala.util.chaining._
def palindrome(i: Int) = i.toString.pipe(s => s == s.reverse)
需要准确地引用某事物两次的情况经常出现,因此将其丰富到一个方法中是很有用的:
implicit class DiamondMapper[A](val a: A) extends AnyVal {
def diamond[B](f: (A,A) => B) = f(a,a)
}
然后:
scala> 575.toString.diamond(_ == _.reverse)
res1: Boolean = true
这是管道运算符的一个特例(|>
如果您喜欢符号表示法),但它是一个足够常见的用例,您可能想要创建自己的用例。
(这里的 Diamond 是因为它取一个值,将其一分为二,然后再次合并。)