Spec-Zone.ru › Crystal

Методы

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

Определение метода обозначается ключевым словом def, за которым следует имя метода. Все выражения до ключевого слова end входят в тело метода.

def say_hello
  puts "Hello Penny!"
end

say_hello
say_hello
say_hello() # syntactically equivalent method call with parentheses

Подсказка

Вызовы методов однозначно обозначаются скобками после имени, но скобки можно опустить. Они нужны только для устранения неоднозначности, например, если say_hello также была бы локальной переменной.

Аргументы

Что, если мы хотим приветствовать разных людей, но делать это одинаково? Вместо отдельных сообщений мы можем определить метод, который позволяет настроить приветствие с помощью параметра. Параметр похож на локальную переменную внутри тела метода. Параметры указываются в скобках после имени метода. При вызове метода можно передать аргументы, значения которых будут присвоены параметрам метода.

def say_hello(recipient)
  puts "Hello #{recipient}!"
end

say_hello "World"
say_hello "Crystal"

Подсказка

Аргументы при вызове метода обычно заключают в скобки, но часто их можно опустить. say_hello "World" и say_hello("World") синтаксически эквивалентны.

Как правило, рекомендуется использовать скобки, поскольку это позволяет избежать неоднозначности. Однако их часто опускают, если выражение звучит как обычная речь.

Аргументы по умолчанию

Аргументам можно присвоить значение по умолчанию. Оно используется, если аргумент не указан при вызове метода. Обычно аргументы обязательны, но при наличии значения по умолчанию их можно опустить.

def say_hello(recipient = "World")
  puts "Hello #{recipient}!"
end

say_hello
say_hello "Crystal"

Ограничения типов

В нашем примере метод ожидает, что recipient будет иметь тип String. Но подойдёт и любой другой тип. Например, попробуйте say_hello 6.

Для этого метода это не обязательно проблема. Использование любого другого типа будет допустимым кодом. Но по смыслу мы хотим приветствовать людей, используя имя типа String.

Ограничения типов определяют допустимый тип аргумента. Они указываются после имени аргумента через двоеточие:

def say_hello(recipient : String)
  puts "Hello #{recipient}!"
end

say_hello "World"
say_hello "Crystal"

# Now this expression doesn't compile:
# say_hello 6

Теперь имена не могут быть числами или иметь другие типы данных. Это не значит, что нельзя приветствовать людей, используя число в качестве имени. Просто число нужно представить в виде строки. Например, попробуйте say_hello "6".

Перегрузка

Ограничение типа аргумента можно использовать для позиционной перегрузки. Если у метода есть аргумент без ограничений, например say_hello(recipient), все вызовы метода say_hello будут направляться в этот метод. При перегрузке же могут существовать несколько методов с одинаковым именем, но разными ограничениями типов аргументов. Каждый вызов направляется к наиболее подходящему варианту перегрузки.

# This methods greets *recipient*.
def say_hello(recipient : String)
  puts "Hello #{recipient}!"
end

# This method greets *times* times.
def say_hello(times : Int32)
  puts "Hello " * times
end

say_hello "World"
say_hello 3

Перегрузка определяется не только ограничениями типов. Количество аргументов и именованные аргументы также являются важными характеристиками.

To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/tutorials/basics/60_methods.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API