Предыдущая часть — часть 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: блоки.





7 059 views