5

我经常发现自己在做这样的事情:

println(foo)

当我想做的时候:

println foo

编译器不允许这样做。

还有,println是拗口,我真的只想说:

echo foo

所以,在一个基础包对象中,我创建了 println 的 echo 版本:

def echo(x: Any) = Console.println(x)

很简单,有广泛的回声应用,很棒。

现在,我如何调用 echo 而无需将 Any 包装在括号中打印?

4

5 回答 5

11
object ∊ {def cho(s: Any) {println(s)}}

∊cho "Hello world"

将节省您的手指。

它之所以有效,是因为 ∊ 是 Unicode Sm 集中的数学符号,因此在 Scala 中算作运算符,因此在放置在字母数字字符旁边时不需要空格。

你也可以

object echo {def -(s: Any) {println(s)}}

echo-"Hello world"

效果很好IMO。

多年后编辑:另一个几乎解决方案,使用StringContext:

implicit class PimpMyString(sc: StringContext) {
  def echo(args: Any*) = println(sc.raw(args: _*))
}

echo"Hello World"
于 2012-04-09T12:42:24.007 回答
5

定义

trait ShortCuts {
  def echo(x: Any) = Console.println(x)
  def trace[T](x: T): T = { echo(x); x }
  // ...
}

object ↬ extends ShortCuts

并愉快地使用没有括号:

↬ echo "hello!"
于 2012-04-09T11:52:45.160 回答
4

Scalaz 有一个增强Identity类型,它有一个println方法。

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> val foo = 1
foo: Int = 1

scala> foo println
1

如果您不想依赖 scalaz,您可以创建自己的皮条客身份并将其隐含在包对象中。

于 2012-04-09T14:10:41.590 回答
3

您想要实现的目标在 Scala 中是不可能实现的。

括号只能以所谓的无点语法删除,其中您必须在函数的左侧有一个上下文对象,因此在您的情况下,您只能实现以下内容,这无论如何都没有任何意义:

Console println x

虽然我可以理解你为什么要实现这一点,可能更好地考虑其他语言的更简单的语法结构,但我建议坚持标准的 Scala 做事方式,所以只需使用println(x)或考虑其他语言。为这样一个基本的标准功能创建一个委托方法肯定会给您在将来管理项目时带来麻烦——因此绝对是该echo方法的“禁忌”。

对于这样的情况,有一句老话:在罗马,做罗马人做的事。

于 2012-04-09T11:42:47.623 回答
1

这里有一组有趣的响应,从无法完成到可以完成,使用这种符号相关的 hack 或使用这种依赖 (Scalaz)

@Nikita 正确地指出,人们可以很容易地在他们的 IDE 中添加一个片段(如果这就是你的滚动方式),它会执行 println “legwork”。虽然这是真的,但您通常必须停止输入才能执行 ctrl-pr 或您决定使用的任何组合键,这会破坏您的流程,IMO。因此,本着创建“更好”的 println 的精神,这是我的看法:

创建一个基础包对象,您的子包(模型、视图、dao 等)将从(基本上是您自己的 PreDef)继承

package com
package object company {

  // echo(foo)
  def echo(x: Any) = Console.println(x)

  // foo.echo   
  class AnyProvidesEcho(x: Any) { def echo = Console.println(x) }
  @inline implicit def any2Echo(x: Any) = new AnyProvidesEcho(x)
}

用法:

val list = List(1,2,3)
val string = "c'est beacoup mieux mit butter"

list foreach echo
echo(string)
string.echo
于 2012-04-09T18:39:22.410 回答