Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala方法中的变量名不明确_Scala_Variables_Scoping_Shadowing - Fatal编程技术网

Scala方法中的变量名不明确

Scala方法中的变量名不明确,scala,variables,scoping,shadowing,Scala,Variables,Scoping,Shadowing,我看到了一些关于Scala和变量作用域的问题(例如) 然而,我很难让我的特定用例正常工作 假设我有一个叫做回购的特质: trait Repo { val source: String } 然后我有一个方法来创建Repo的实现 def createRepo(source: String) = new Repo { val source: String = source } 当然,我使用了两个source变量,一个在方法级别,另一个在Repo实现内部。如何从我的Repo

我看到了一些关于Scala和变量作用域的问题(例如)

然而,我很难让我的特定用例正常工作

假设我有一个叫做回购的特质:

trait Repo {
    val source: String
}
然后我有一个方法来创建Repo的实现

def createRepo(source: String) = 
  new Repo {
    val source: String = source
  }
当然,我使用了两个
source
变量,一个在方法级别,另一个在
Repo
实现内部。如何从我的
Repo
定义中引用方法级


谢谢

不确定这是否是一种规范的方式,但它是有效的:

def createRepo(source: String) = {
  val sourceArg = source
  new Repo {
    val source = sourceArg
  }
}
或者,您可以给参数输入一个不冲突的不同名称

或者,制造一个工厂:

object Repo {
  def apply(src: String) = new Repo { val source = src }
}

def createRepo(source: String) = Repo(source)

除了路易吉的解决方案之外,您还可以考虑将<代码> ReP< <代码>从一个特性更改为一个类,

class Repo(val source: String)
def createRepo(source: String) = new Repo(source)

因为两者都引用同一个对象,所以这不重要。@user unknown,这很重要,因为在第二个实例中,
source
被“递归”绑定,但类初始化语义使其
null
。从REPL中尝试它,您将看到:
createRepo(“hi”)。source==null