Синтаксис метода установки Ruby method=(value) — сравнение с Java

Привет, дорогие stackoverflowers :)

Я пришел с Java и сомневаюсь в синтаксисе геттеров (если это действительно проблема синтаксиса).

В java у вас будет такой сеттер, как

private void setName(value) {
    variableName = value;
}

который примет значение в качестве аргумента и изменит внутри него переменную экземпляра.

В ruby, когда я явно определяю установщик (из-за ограничений), мне нужно использовать set_name=(value), или если я использую синтаксис set_name(value), будет то же самое? Другими словами, = в конце имени метода делает что-то еще или это просто синтаксис (например, ! и ?).

Как это:

def set_name=(value)
    @name = value
end

Или это:

def set_name(value)
    @name = value
end

Заранее спасибо за внимание.

Алекс


person alestuber    schedule 02.06.2014    source источник
comment
Это кажется довольно простым вопросом — используете ли вы какие-либо книги или веб-сайты для изучения Ruby?   -  person Andrew Grimm    schedule 03.06.2014
comment
Да, я использую teamtreehouse, а также смотрю в Интернете, чтобы увидеть концепции. Но этот после поиска почти во всей сети мне все еще не был понятен.   -  person alestuber    schedule 03.06.2014


Ответы (3)


Завершающий = в имени метода идентифицирует метод как метод установки/мутатора. Когда вы говорите это в Ruby:

o.p = v

Вы действительно говорите:

o.send(:p=, v)

поэтому o.p = v — это просто причудливый способ вызова метода p= в o. Вот почему такие вещи:

's'.pancakes = 11

дает вам исключение NoMethodError, которое жалуется на то, что 's' не имеет метода pancakes=: строки не (к сожалению) имеют методы pancakes=.

В вашем случае вы бы вообще не использовали set_name, у вас был бы метод name=:

def name=(value)
  @name = value
end

и, возможно, метод name в качестве средства доступа/получателя:

def name
  @name
end
person mu is too short    schedule 02.06.2014

Самый идиоматический подход в Ruby — сделать

def name=(value)
  @name = value
end

или еще лучше,

attr_writer :name
person Andrew Grimm    schedule 02.06.2014

Мне нужно использовать set_name=(value) или если я использую синтаксис set_name(value) будет то же самое?

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def name1=(str)
    @name = str
  end

  def name2(str)
    @name = str
  end
end

d = Dog.new("Rover")
puts d.name  #=>Rover
d.name1 = "Ruthie"
puts d.name  #=>Ruthie
d.name2("John")
puts d.name  #=>John
d.name2 = "Roger"

--output:--
1.rb:23:in `<main>': undefined method `name2=' for #<Dog:0x00000100907030 @name="John"> (NoMethodError)

Для сеттеров имя метода включает знак '='. Но ruby ​​также позволяет использовать синтаксический сахар с именами методов, оканчивающимися на '=':

obj.setter_name = value

эквивалентно:

obj.setter_name=(value)
person 7stud    schedule 03.06.2014