Scala中JavaScript的“with”构造

Scala中JavaScript的“with”构造,javascript,scala,Javascript,Scala,Scala是否有类似于JavaScript的功能,或者可以通过某种方式实现,例如库、隐式或宏 在JS中使用的示例: 函数p{ document.writeI am+this.constructor.name+。; } 功能o1{ 这个,p=p; } var i1=新的o1; i1.p; P withi1{p;} 输出: I am o1. I am Window. I am o1. 我正在寻找的示例: A类{def x{…} val a=新a 用{x} 我唯一想到的是使用匿名函数,但这只是一个名

Scala是否有类似于JavaScript的功能,或者可以通过某种方式实现,例如库、隐式或宏

在JS中使用的示例:

函数p{ document.writeI am+this.constructor.name+。; } 功能o1{ 这个,p=p; } var i1=新的o1; i1.p; P withi1{p;} 输出:

I am o1.
I am Window.
I am o1.
我正在寻找的示例:

A类{def x{…} val a=新a 用{x} 我唯一想到的是使用匿名函数,但这只是一个名称替换,仅此而已,而且非常冗长

aa:A=>aa.xa 如果要限制导入的范围,请使用大括号:

{
  import a._
  // namespace madness
}
// everything's back to normal here
REPL中的示例:

scala> val i = ""
i: java.lang.String = ""

scala> import i._
import i._

scala> length
res0: Int = 0
您还可以执行有限的导入:

import a.{thingImGonnaUse, anotherImportantThing}
甚至可以重命名它们:

import a.{thingImGonnaUse => tigu, anotherImportantThing => ait}
这比仅仅执行val ait=a更强大。另一个重要的事情是,它仍然允许您使用重载版本:

scala> val i = "0123456"
i: java.lang.String = 0123456

scala> import i.{substring => x}
import i.{substring=>x}

scala> x(3)
res1: java.lang.String = 3456

scala> x(2,3)
res2: java.lang.String = 2

scala> val y = i.substring _
<console>:15: error: ambiguous reference to overloaded definition,
both method substring in class String of type (x$1: Int, x$2: Int)java.lang.String
and  method substring in class String of type (x$1: Int)java.lang.String
match expected type ?
       val y = i.substring _
                 ^

在JS中永远不要使用with。它坏了。不太清楚你为什么想要一个{x}。你能详细说明一下吗?我这样问是因为类似的构造肯定是可能的,但对我来说没有意义,我希望使用类似的构造,因为在我看来,它看起来更清晰/更好,没有占用太多空间,比范围有限的val更简洁:{/*newLine*/val a=somereallongexpression/*newLine*/a.method1/*newLine*/a.method2/*newLine*/}与使用SomereAllonExpression{/*newLine*/method1/*newLine*/method2/*newLine*/}相比,导入看起来没那么糟糕,但它不适用于vars。@不适用于主题。我没有使用JS,没有计划,没有询问,如果JS的一些实现不能很好地处理,这并不重要。这是一个Scala问题。JS的with只是一个例子,在原始问题中也是我希望在Scala中实现的一个例子。回答得好,谢谢。我不知道import语句可以引用实例。我不确定是否应该让问题保持原样,因为import不能用在vars上,而JS中的vars对所有东西都有效,至少我认为。var x=。。。;val y=x;导入y.。我正在寻找的解决方案应该提高代码的可读性,使用这种方法,我不确定它是否会看起来更好/更清晰。
scala> val i = "0123456"
i: java.lang.String = 0123456

scala> import i.{substring => x}
import i.{substring=>x}

scala> x(3)
res1: java.lang.String = 3456

scala> x(2,3)
res2: java.lang.String = 2

scala> val y = i.substring _
<console>:15: error: ambiguous reference to overloaded definition,
both method substring in class String of type (x$1: Int, x$2: Int)java.lang.String
and  method substring in class String of type (x$1: Int)java.lang.String
match expected type ?
       val y = i.substring _
                 ^