Предыдущая часть – часть 7: циклы while, for, until, break, redo и retry.
Методы в Ruby очень схожи с функциями в других яхзыках программирования. Методы используются для того, что бы собрать в одном месте несколько операторов.
Имена методов в Ruby должны начинаться со строчной буквы.
Методы должны быть описаны до того, как их можно будет использовать.
Синтаксис:
def method_name [( [arg [= default]]...[, * arg [, &expr ]])] expr.. end
Т.е. опеределить простой метод можно так:
def имя_метода выражение(я) end
А метод, который принимает аргументы – так:
def имя_метода(параметр1, параметр2) выражение(я) end
Аналогично предыдущему примеру – но с параметрами по умолчанию:
def имя_метода(параметр1=1, параметр2="2") выражение(я) end
Каждый раз, когда вы хотите вызывать метод – вам достаточно указать его имя:
имя_метода
А для вызова метода с аргументами – передать их через пробел (или в скобках, хотя некоторые стараются избегать такого кода):
имя_метода аргумент1 аргумент2
имя_метода(аргумент1, аргумент2)
Пример:
#!/usr/bin/ruby def test(a1="Ruby", a2="Perl") puts "The programming language is #{a1}" puts "The programming language is #{a2}" end test "C", "C++" test
Результат:
$ ./methods.rb The programming language is C The programming language is C++ The programming language is Ruby The programming language is Perl
Содержание
Возвращаемые значения методов
Каждый метод по умолчанию возвращает значение последнего оператора, например:
#!/usr/bin/env ruby def test i = 100 j = 10 k = 0 end puts test
Результат:
$ ./m2.rb 0
Оператор return
Используется для возврата одного и более значений из метода.
Синтаксис:
return [expr[`,' expr...]]
Если return
содержит несколько выражений – они будут переданы все. Если ни одного – будет передан nil
.
Пример:
#!/usr/bin/ruby def test i = 100 j = 200 k = 300 return i, j, k end var = test puts var
Результат:
$ ./return.rb 100 200 300
Переменное количество аргументов метода
Что бы создать метод, который сможет принимать любое количество аргументов используется символ *
, например:
#!/usr/bin/ruby def sample (*test) puts "The number of parameters is #{test.length}" for i in 0...test.length puts "The parameters are #{test[i]}" end end sample "Zara", "6", "F" sample "Mac", "36", "M", "MCA"
В этом примере создается один метод – sample
, у которого есть один параметр – test
. Однако с *
он может принимать любое их количество.
Результат выполнения этого кода:
$ ./args.rb The number of parameters is 3 The parameters are Zara The parameters are 6 The parameters are F The number of parameters is 4 The parameters are Mac The parameters are 36 The parameters are M The parameters are MCA
Методы класса
Каждый раз, когда вы хотите обратиться к методу класса – вам необходимо принициализировать его. Однако в Ruby реализована возможность обращаться к некоторым методам напрямую, например:
#!/usr/bin/env ruby class Accounts def reading_charge return "reading_charge" end def Accounts.return_date return "Accounts.return_date" end end begin puts Accounts.reading_charge rescue NoMethodError => error puts error cl = Accounts.new puts cl.reading_charge puts Accounts.return_date end
Результат:
$ ./pub_priv.rb undefined method `reading_charge' for Accounts:Class reading_charge Accounts.return_date
Оператор alias
alias
используется для создания псевдонимов методов или глобальных переменных. Алиас нельзя определять в теле метода. Алиас будет хранить описание метода, даже если сам метод будет перезаписан.
Синтаксис:
alias new-method-name method-name alias new-global-variable-name
Пример:
#!/usr/bin/env ruby $GLOB = "glob" puts "Glob: #{$GLOB}" alias $NEWGLOB $GLOB puts "Glob alias: #{$NEWGLOB}"
Результат:
$ ./alias.rb Glob: glob Glob alias: glob
Оператор undef
Удаляет определение метода. Не может использоваться внутри методов.
С помощью alias
и undef
– можно изменить интерфейс вашего класса, не изменяя поведение родительского класса.
Синтаксис:
undef method-name
Пример:
#!/usr/bin/env ruby class A def meth puts "Let shall weld methamphetamine" end end A.new.meth A {undef :meth} A.new.meth
Результат:
$ ./undef.rb Let shall weld methamphetamine ./undef.rb:11:in `<main>': undefined method `A' for main:Object (NoMethodError)
Продолжение – часть 9: блоки.