Подтвердить что ты не робот

Что делает символ равенства ('='), когда он ставится после имени метода в определении метода?

Я видел это в скринкасте и просто задавался вопросом, что делает символ "=" в этом случае.

def express_token=(token)
...
end

Я бы понял, было ли это что-то вроде этого -

def express_token(token = nil) 

Вышеупомянутый (второй фрагмент кода) означает установку нуля в качестве значения по умолчанию параметра токенов. Однако в первом фрагменте кода '=' находится вне скобок.

Спасибо заранее.

4b9b3361

Ответ 1

Этот фрагмент определяет Виртуальный атрибут (или метод setter), так что выражение "express_token" выглядит как атрибут, хотя это просто имя метода, Например:

class Foo
  def foo=(x)
    puts "OK: x=#{x}"
  end
end
f = Foo.new
f.foo = 123 # => 123
# OK: x=123

Обратите внимание, что объект "f" не имеет атрибута или переменной экземпляра с именем "foo" (а также не нужен), поэтому метод "foo =" является просто синтаксическим сахаром, позволяющим вызвать вызов метода, который выглядит как присвоение. Также обратите внимание, что такие методы setter всегда возвращают свой аргумент независимо от любого оператора return или конечного значения.

Если вы определяете метод set-level setter, например, в "irb", тогда поведение может быть немного запутанным из-за неявного добавления методов к классу Object. Например:

def bar=(y)
  puts "OK: y=#{y}"
end
bar = 123 # => 123, sets the variable "bar".
bar # => 123
Object.new.bar = 123 # => 123, calls our method
# OK: y=123
Object.public_methods.grep /bar/ # => ["bar="]

Ответ 2

Эти методы позволяют вам устанавливать экземпляры vars более косвенным образом: представьте, что у вас есть класс Person

class Person < ActiveRecord::Base
  attr_accessible :first_name, :last_name

  def full_name
    [@first_name, @last_name].join
  end

  def full_name=(name)
    @first_name, @last_name = name.split(" ")
  end
end

Затем вы можете сделать что-то вроде этого:

p = Person.new
p.full_name = "John Doe"
p.first_name # => "John"
p.last_name # => "Doe"
p.full_name # => "John Doe"

Ответ 3

Фактически это часть имени функции. Таким образом, это сеттер, если вам нужна отдельная функциональность, чем по умолчанию для геттеров и сеттеров.

Ответ 4

Посмотрим на следующий пример:

class NewDog  
  def initialize(breed)  
    @breed = breed  
  end

  # create reader only
  attr_reader :breed, :name 

  # setter method  
  def set_name(nm)  
    @name = nm  
  end  
end  

nd = NewDog.new('Doberman')  
nd.set_name('Benzy')  
puts nd.name  

Если вы реорганизуете метод setter на это:

def name=(nm)  
  @name = nm  
end 

другие программисты знают, что метод name= ведет себя как метод setter. Также как show by @maerics он ведет себя как виртуальный атрибут.

Результат выглядит следующим образом:

class NewDog  
  def initialize(breed)  
    @breed = breed  
  end  

  # create reader only  
  attr_reader :breed, :name 

  # setter method  
  def name=(nm)  
    @name = nm  
  end  
end  

nd = NewDog.new('Doberman')  
nd.name = 'Benzy'  
puts nd.name