代码之家  ›  专栏  ›  技术社区  ›  Geo

我可以将对象的实例方法传递给scala中需要回调的方法吗?

  •  5
  • Geo  · 技术社区  · 15 年前

    假设我有一个方法期望另一个方法作为参数。是否可以为该参数发送对象的实例方法?我如何处理没有参数的方法?

    我会写一些伪代码:

    void myMethod1(callback<void,int> otherFunc); // imagine a function returning void, and taking a int parameter
    
    void myMethod2(callback<int,void> otherFunc); // function returning void, not taking params
    

    例如,如果我有一个数组列表,如下所示:

    val a = new ArrayList()
    

    我怎么寄呢 add 方法作为参数 myMethod1 和它的 size 方法作为参数 myMethod2 ?

    3 回复  |  直到 15 年前
        1
  •  4
  •   retronym    15 年前

    我想 myMethod4 当您说:“难道不可能引用a.size并在需要时调用它吗?”.

    def myMethod1(f: Int => Unit): Unit = f(1)
    
    def myMethod2(f: () => Int): Unit = {
      val value = f // f is function, taking no arguments, and returning an int.
                    // we invoke it here.
      ()
    }
    
    def myMethod3(f: => Int): Unit = {
      val value = f // f is call by name parameter.
      ()
    }
    
    def myMethod4[A](f: A => Int, a: A): Unit = {
      val value = f(a)
      ()
    }
    
    import java.util.ArrayList
    
    val a = new ArrayList[Int](1)
    myMethod1((i: Int) => a.add(i))
    myMethod1(a.add(_))     // shorthand for the above
    myMethod2(() => a.size) // a.size is not evaluated, it is enclosed in an anonymous function definition.
    myMethod3(a.size)       // a.size is not evaluated here, it is passed as a by-name parameter.
    myMethod4((al: ArrayList[Int]) => al.size, a)
    myMethod4((_: ArrayList[Int]).size, a)
    myMethod4[ArrayList[Int]](_.size, a)
    
        2
  •  5
  •   Rex Kerr    15 年前

    scala中的函数类型表示为

    (Types,To,Pass) => ReturnType
    

    (如果只有一个类型要传递,则可以不使用parens),而将方法转换为函数以传递给另一个方法的方法是

    myObject.myMethod方法_

    所以,把它们放在一起——注意Java类的类型:

    scala> def addMySize(adder: Int => Boolean, sizer: () => Int) = adder(sizer())
    addMySize: ((Int) => Boolean,() => Int)Boolean
    
    scala> val a = new java.util.ArrayList[Int]()
    a: java.util.ArrayList[Int] = []
    
    scala> addMySize(a.add _, a.size _)
    res0: Boolean = true
    
    scala> addMySize(a.add _, a.size _)
    res1: Boolean = true
    
    scala> println(a)
    [0, 1]
    

    (注意,arraylist有一个add,它接受一个对象并返回一个布尔值,而不是返回void的值。)

        3
  •  4
  •   Dario    15 年前
    def myMethod(callback : Int => Unit, size : => Int) = ...
    
    myMethod(a.add _, a.size)
    

    Void 通过类型表示 Unit .

    编辑:通过以上使用 => Int , size 通过名称传递,这意味着在需要时总是重新评估它。