2014-09-05 5 views
0

Привет, я изучаю язык scala и задаю вопрос. Я читаю книгу, и один из примеров говорит, что от 0 до 2 такое же, как (0) .to (2). Как я могу интерпретировать этот синтаксис? Я имею в виду, я вижу, что это функция, которая принимает одно целое значение в качестве своего параметра. Но что такое «(0)». часть?? СпасибоСинтаксис вызова функции в scala

ответ

5

В scala любой метод, принимающий один параметр, может быть записан с помощью синтаксиса infix.

Так, например, если у вас есть

class Foo(x: Int) { 
    def add(y: Int) = x + y 
} 
val a = new Foo(42) 

, то эти два метода звонки точно эквивалентны

a.add(4) // 46 
a add 4 // 46 

Причина, почему есть скобка вокруг 0 является то, что в более ранних версиях Скале 0. было бы интерпретировано как число с плавающей запятой из-за неоднозначного значения . (которое может быть как десятичным разделителем, так и селектором методов). Поскольку Scala 2,11 (или 2,10, я не помню), это было исправлено, так что теперь вы можете смело вводить

0.+(2) // Int: 2 

и получить Int назад, в то время как вы бы имели Float в прошлом, как компилятор увидел бы его как

0.0 + (2) // Float: 2 
+0

Кроме того, целые числа и другие примитивные типы автоматически преобразуются в эквивалентные типы объектов.Значение '0' является целым числом и автоматически преобразуется в' Int'. 'Int' имеет метод' to() ', который принимает один целочисленный аргумент. –

+0

@Bob, это больше наоборот. «Int» - это тип объекта, который затем представляется примитивом в базовой JVM. –

+0

стирание в 2.10, новое поведение в 2.11. Разница находится в 'val i = 0.;' которая была двойной, но теперь была ошибкой. –

0

Я имею в виду, я могу видеть, что to это функция, которая принимает один целое значение в качестве параметра.

Нет, это не функция, это метод.

методы вызываются отправкой сообщения объекту:.

foo.bar(baz) 

Это означает, что «отправить сообщение bar с объектом, на который ссылается baz в качестве аргумента объект, на который ссылается foo Это, в свою очередь, вызывают метод bar в классе foo «s или одного из его предков, который будет вызван.

Итак, to это сообщение, 2 является аргументом, и 0 является получателем й e сообщение.

Scala позволяет использовать либо . или пробел для отправки сообщения:

foo bar(baz) 
// is the same as 
foo.bar(baz) 

Кроме того, при использовании пробелов для отправки сообщения, вы можете оставить вне скобок последнего списка аргументов, если он имеет только единственный аргумент:

foo bar baz 
// is the same as 
foo bar(baz) 

И, наконец, круглые скобки используются не только для списков аргументов, они также используются для группировки. (. И кортежей литералов, а) Вы всегда можете окружить выражение со скобками, чтобы уточнить его преимущество:

(foo).bar(baz) 
// is the same as 
foo.bar(baz) 
Смежные вопросы