Scala对同一对象执行多个操作,而不重复其名称

时间:2017-07-17 06:39:21

标签: scala

在kotlin中,您可以使用fun alphabet() = with(StringBuilder()) { for (letter in 'A'..'Z') { append(letter) } append("\nNow I know the alphabet!") toString() } 接收函数来实现以下目标:

StringBuilder

因此您不必重复{{1}}个对象。我想知道在Scala中执行它的语法是什么?

3 个答案:

答案 0 :(得分:2)

它与Scala中的导入大致相同(就我的例子而言)。

def alphabet = {
  val builder = new StringBuilder
  import builder._
  for(letter <- 'A' to 'Z') append(letter)
  append("\nNow I know the alphabet!")
  mkString // toString would be ambiguous unfortunately
}

或者您可以使用两种扩展方法寻求更具功能性的方法。我们称他们为tappipe

implicit class TapExtensions[A](private val a: A) extends AnyVal {
  def tap[B](f: A => B): A = { f(a); a }
  def pipe[B](f: A => B): B = f(a)
}

def alphabet = 
  new StringBuilder()
    .tap( b => for(letter <- 'A' to 'Z') b.append(letter) )
    .tap( _.append("\nNow I know the alphabet!") )
    .pipe( _.toString )

答案 1 :(得分:1)

典型功能.foldLeft是您在scala中需要的

('A' to 'Z')
    .foldLeft(new StringBuilder)((a, b) => a append b)
    .append("\nNow I know the alphabet!")

+代替append

('A' to 'Z')
    .foldLeft(new StringBuilder)((a, b) => a + b)
    + "\nNow I know the alphabet!"

输出

ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the alphabet!

答案 2 :(得分:0)

对于特定任务,您还可以使用mkString函数获取所需的结果 这就是你能做的事情

('A' to 'Z').mkString("") + 
"\nNow I know the alphabet!"

输出:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the alphabet!

希望这有帮助!