Scala 可以在I'之前引用对象的成员;你实例化了这个对象吗?

Scala 可以在I'之前引用对象的成员;你实例化了这个对象吗?,scala,Scala,下面是我想做的(警告:前面的Scala非常糟糕): 显然,这根本不起作用,但我正在寻找一种模式,它允许我在抽象中引用实例的一个成员,然后在以后的某个时候,在实际实例上访问该成员 如果这是Java,我会使用反射,但反射很糟糕,我希望比Java糟糕得多的Scala会有更好的选择。您可以使用结构类型,这样您就不会依赖于特定的类型(尽管失去了一些灵活性,无法传递属性名称进行更新): 虽然结构类型是一种替代方法,但它们在内部使用反射 实际上,您要做的是调用某个属性的setter,以便将其概括为函数调用:

下面是我想做的(警告:前面的Scala非常糟糕):

显然,这根本不起作用,但我正在寻找一种模式,它允许我在抽象中引用实例的一个成员,然后在以后的某个时候,在实际实例上访问该成员


如果这是Java,我会使用反射,但反射很糟糕,我希望比Java糟糕得多的Scala会有更好的选择。

您可以使用
结构类型
,这样您就不会依赖于特定的类型(尽管失去了一些灵活性,无法传递属性名称进行更新):


虽然结构类型是一种替代方法,但它们在内部使用反射

实际上,您要做的是调用某个属性的setter,以便将其概括为函数调用:

def applyWith4[X,Y](x: X)(f: X => Int => Y) = f(x)(4)
这个方法有两个参数:一个是
X
的实例,另一个是
f
函数,它将
X
转换成从
Int
到某个类型
Y
(在您的例子中,这将是
单位

现在您可以使用

applyWith4(em)(x => x.m = _)
或者使用生成的setter
m\u9=
,在较短但可读性较差的变体中:

applyWith4(em)(_ m_=)
因此:

  • Scala的属性作为一对方法实现。对于
    var m
    来说,getter将被命名为
    m
    ,setter方法将被命名为
    m=
  • 方法可以自动提升为函数
  • 函数可以作为一级值传递
从这里开始:

class M {
  var m = 0
}

val x = new M
x、 m当前为0,让我们更改它。。。 下面是一个方法,该方法将函数作为其参数,并使用值
4
调用该函数:

def callWithFour(fn: Int=>Unit) = fn(4)
使用它:

callWithFour(x.m_=)
其中,
x.m
是实例
x


x.m
现在等于四。

我想这个问题需要一种方法来抽象
y
@Ben,是的,没错,但我已经忘记了结构类型有多酷。还有其他:我还在学习Scala——你能再解释一下这个语法吗(或者链接到更多信息)?@Adny,这是一个很好的主题介绍:
def callWithFour(fn: Int=>Unit) = fn(4)
callWithFour(x.m_=)