Скажем, у меня есть метод, ожидая другой метод в качестве параметра. Действительно ли возможно отправить методы экземпляра объекта за тем параметром? Как я обработал бы методы, которые не имеют никаких параметров?
Я запишу некоторый псевдокод:
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
если, например, у меня есть ArrayList, как это:
val a = new ArrayList()
как я мог отправить, это add
метод как параметр для myMethod1
, и это size
метод как параметр для myMethod2
?
Я думаю, что 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)
Тип функции в Scala обозначается
(Types,To,Pass) => ReturnType
(можно оставить без парен, если передается только один тип), а способ преобразования метода в функцию для передачи в другой метод -
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 есть дополнение, которое принимает объект и возвращает булевую--не возвращает пустую)
.Вы можете использовать более мощный профилировщик, такой как VTUNE Intel, который может дать вам уровень сборки в сборке деталей производительности.
http://software.intel.com/en-us/intel-vtune/
Это для Windows и Linux, но это стоит денег ...
-121--1687205-def myMethod(callback : Int => Unit, size : => Int) = ...
myMethod(a.add _, a.size)
Void
представлен через тип
.
Редактировать: через вышеупомянутое использование => INT
, размер
пропускается по имени, что означает, что он всегда переоценен при необходимости.