Использование собственных методов, методов примесей и открытых методов

Вот код, который я использую в классе Game:

def play
  puts "There are #{@players.length} players in #{@title}."

  @players.each do |n|
    puts n
   end

  @players.each do |o|
    GameTurn.take_turn(o)
    puts o
  end
end

Он использует строку кода, которая ссылается на модуль под названием GameTurn. В GameTurn у меня есть метод self.take_turn:

require_relative "die"
require_relative "Player"

module GameTurn

  def self.take_turn(o)
    die = Die.new

    case die.roll
    when 1..2
      o.blam
      puts "#{o.name} was blammed homie."
    when 3..4
      puts "#{o.name} was skipped." 
    else
      o.w00t
    end
  end
end

Я немного смущен, почему мы используем «я» и разницу между открытыми методами и методами примесей в модулях. Я спросил это "методы экземпляров классов и методы модуля"

Является ли take_turn открытым методом? Несмотря на то, что мы передаем в метод take_turn объект из класса игрока, считается ли этот метод методом модуля, который мы используем напрямую? Разве это не считается методом миксина? Мы подаем в метод take_turn объект из другого класса, так не смешивается ли он с другими классами?

Кроме того, я все еще пытаюсь понять, когда и почему мы используем термин «я»? Просто кажется странным, что нам нужно определить метод take_turn в модуле GameTurn, используя термин «я». Кажется, это должно быть определено без «я», нет?


person Jwan622    schedule 23.10.2014    source источник
comment
возможный дубликат Зачем префикс метода с self   -  person infused    schedule 24.10.2014
comment
У тебя слишком много вопросов. Пожалуйста, уменьшите их до одного или максимум двух, если они тесно связаны.   -  person the Tin Man    schedule 24.10.2014


Ответы (1)


Хорошо, с самого начала:

self всегда возвращает объект, в контексте которого он выполняется. Так вот:

class A
  self     #=> A
end

В ruby ​​вы можете определить методы для объектов в полете, вы можете, например, сделать:

o = Object.new

o.foo   #=> NameError 

def o.foo
  :foo
end

o.foo   #=> :foo

Классы и модули — это такие же объекты, как и все остальное, поэтому вы также можете определить для них методы:

def A.method
  'class method'
end

A.method    #=> 'class_method'

Однако гораздо проще и удобнее определить его в теле класса — из-за self, который всегда возвращает сам класс:

class A
  def self.foo
    :foo
  end
end

self возвращает A, поэтому это можно прочитать как:

class A
  def A.foo
    :foo
  end
end

Хорошо то, что если вы решите изменить имя класса, вам нужно будет сделать это только сверху, рядом с class — обо всем остальном позаботится self.

В методе self всегда является получателем метода. Так:

o = Object.new
def o.method
  self
end
o.method == o       #=> true

Однако время от времени это может быть довольно запутанным. Общая путаница исходит из кода:

class A
  def get_class
    self.class
  end
end

class B < A
end

b = B.new
b.get_class     #=> B

хотя get_class определен в классе A, self относится к получателю метода, а не к владельцу метода. Следовательно, он оценивается как:

b.class         #=> B

По той же причине self внутри методов класса всегда указывает на класс, в котором выполняется метод.

person BroiSatse    schedule 23.10.2014
comment
Супер ясно, и я последовал за вами. Надеюсь, это прояснит вопросы о себе для меня в будущем. Спасибо! - person Jwan622; 24.10.2014