我可以传递一个对象吗';将实例方法转换为在Scala中需要回调的方法?

我可以传递一个对象吗';将实例方法转换为在Scala中需要回调的方法?,scala,callback,functional-programming,Scala,Callback,Functional Programming,假设我有一个方法需要另一个方法作为参数。是否可以为该参数发送对象的实例方法?如何处理没有参数的方法 我将编写一些伪代码: void myMethod1(callback<void,int> otherFunc); // imagine a function returning void, and taking a int parameter void myMethod2(callback<int,void> otherFunc); // function returni

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

我将编写一些伪代码:

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
我如何将它的
add
方法作为
myMethod1
的参数,以及它的
size
方法作为
myMethod2
的参数发送

def myMethod(callback : Int => Unit, size : => Int) = ...

myMethod(a.add _, a.size)
Void
通过类型
单元
表示


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

我认为
myMethod4
可能就是你说的“不可能引用一个.size并在需要时调用它吗?”


Scala中函数的类型表示为

(Types,To,Pass) => ReturnType
(如果只有一个要传递的类型,则可以省去paren),将方法转换为要传递给另一个方法的函数的方法是

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的值。)

是否可以引用
a.size
并在需要时调用它?您的意思是按名称传递size:Int吗?def myMethod(callback:Int=>Unit,size:=>Int)重要的是要知道并记住,在Scala中,方法和函数是非常不同的东西。方法不是一级实体,但函数是。因此(撇开反射不谈),没有方法将另一个方法作为参数。部分应用程序可以与方法或函数一起使用,并始终生成函数。请您解释一下在方法2/3/4中空的parantises是如何工作的吗?块
{a;b;c}
必须包含一系列表达式和声明(var、val、类、函数、trait、object)。它必须以表达式结束。为清楚起见,我将
f
的结果赋给了val
值,因此我需要在后面加上一个表达式,该表达式符合块的预期类型,在本例中是函数的声明类型:
Unit
()
是类型
单元
的唯一实例。一个空的
返回也可以工作。与任何其他类型的表达式一样,任何值都可以转换为类型
Unit
(Types,To,Pass) => ReturnType
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]