Ruby: с нуля – часть 8: методы

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