我经常发现自己做的事情如下:
println(foo)
当我想做的时候:
println foo
编译器不允许这样做。
另外,println是满口的,我真的只想说:
echo foo
因此,在基础包对象中,我创建了println的echo版本:
def echo(x: Any) = Console.println(x)
足够简单,有回声应用广泛,很棒。
现在,我如何调用echo而不需要将Any包装在parens中打印?
答案 0 :(得分:11)
object ∊ {def cho(s: Any) {println(s)}}
∊cho "Hello world"
会保存你的手指。
这是有效的,因为ε是Unicode Sm集中的数学符号,因此计为operator in Scala,因此当放置在字母数字字符旁边时不需要空格。
你也可以
object echo {def -(s: Any) {println(s)}}
echo-"Hello world"
IMO很好用。
YEARS LATER EDIT :另一个几乎解决方案,使用StringContext:
implicit class PimpMyString(sc: StringContext) {
def echo(args: Any*) = println(sc.raw(args: _*))
}
echo"Hello World"
答案 1 :(得分:5)
定义
trait ShortCuts {
def echo(x: Any) = Console.println(x)
def trace[T](x: T): T = { echo(x); x }
// ...
}
object ↬ extends ShortCuts
并且在没有括号的情况下愉快地使用:
↬ echo "hello!"
答案 2 :(得分: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,您可以创建自己的pimped身份并在包对象中隐含它。
答案 3 :(得分:3)
Scala无法实现您的目标。
括号只能在所谓的无点语法中删除,在该语法中你必须在函数的左侧有一个上下文对象,所以在你的情况下你只能实现以下内容,无论如何感觉:
Console println x
虽然我可以看到为什么你想要实现这一点,可能更好地考虑更简单的其他语言的语法结构,我建议只是坚持标准的Scala做事方式,所以只需使用println(x)
或考虑其他语言。为这样的基本标准功能创建委派方法肯定会给您在项目的未来管理中带来麻烦 - 所以echo
方法肯定是“禁忌”。
对于这样的案件有一句老话:在罗马时,像罗马人那样做。
答案 4 :(得分:1)
这里有一组有趣的回复,包括,无法完成,可以通过这种符号依赖的黑客,或者使用此依赖(Scalaz)来完成
@Nikita正确指出,人们可以轻松地将一个片段添加到他们的IDE中(如果这就是你的滚动方式),这就是println“legwork”。虽然这是真的,但你通常不得不停止输入ctrl-p-r,或者你决定使用的任何键组合,这会破坏你的流量,IMO。因此,本着创造“更好”的印刷品的精神,这是我的看法:
创建一个基础包对象,子包(model,view,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