2016-06-16 2 views
0

Я пытаюсь выполнить булеву типа в Scala, и я нашел пример использования этой подписи:Использование параметра Тип в Scala Функции

abstract class Boolean { 
    def ifThenElse[T](t : => T , e : => T) : T 

    ... } 

Мои вопросы:

  1. Когда мы должен использовать тип Parameter после имени функции, такого как funcName [T].

  2. Что означает t: => T?

Спасибо

ответ

2

Что касается первого вопроса:

1.Когда мы должны использовать тип параметра после имени функции, как этот имя_функции [T]

если вы хотите, чтобы эта функция использовалась по-разному, то стоит признать, что общий тип после имени функции равен funcName[T]. Например, у вас есть функция, как этот

def myFunction[T](param1: T){/*process*/} 

вы хотите передать параметр param1 и param2 к myFunction. Эти два параметра определяются следующим образом

val param1: Int = 10 
val param2: String = "test" 

Хотя param1 и param2 имеют различные типы, вы можете вызвать функцию myFunction(param1), а также myFunction(param2)

Тогда давайте поговорим о втором вопросе

2 . Что означает t: => T?

Это by-name parameter. что это? Ниже дает вам более подробную информацию:

t: => T имеет такое же значение, как и t:() => T, вместо inputing слова () => T, вы можете выбрать => T как для t

Другой пример: если вы хотите есть утверждение, вы можете определим функцию следующим образом:

def myAssert(predicate:() => Boolean) = 
    if(!predicate()) throw new AssertionError 

, то вы можете использовать его следующим образом

myAssert(() => 5 > 3) 

Использование настолько уродливое, не так ли? Вы можете использовать его как этот

myAssert(5 > 3) 

в это время, by-name parameter будет на сцене.Просто определите функцию помощи by-name parameter

def myAssert(predicate: => Boolean) = //leave out '()' 
    if(!predicate) throw new AssertionError //leave out '()' 

то, вы можете использовать myAssert, как указано выше

myAssert(5 > 3) 

Примечания: Побочный имя типа, в котором пустой список параметров,() , опускается, разрешено только для параметров. Нет такой вещи, как переменная by-name или поле для имени.

Удачи вам.

+0

(1) 'def compare [T] (num1: T, num2: T): Boolean ...' не является хорошим примером, если вы не хотите сравнивать хэш-коды, так как вы ничего не знаете о типе ' T'. Контейнеры - лучшие примеры без ограничений типа. (2) В первом 'def myAssert ...' вы должны писать 'if (! Predicate())', функции требуют явных скобок. –

Смежные вопросы