Метод синтаксиса метода установки Ruby = (значение) - Сравнение с Java

1

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

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

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

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

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

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

Как это:

def set_name=(value)
    @name = value
end

Или это:

def set_name(value)
    @name = value
end

Заранее благодарим за внимание.

Alex

  • 0
    Это кажется довольно простым вопросом - используете ли вы какие-либо книги или сайты для изучения Ruby?
  • 0
    Да, я использую teamtreehouse, а также смотрю в Интернете, чтобы увидеть концепции. Но этот после поиска почти по всей сети, все еще был неясен для меня.
Теги:
methods
setter

3 ответа

2
Лучший ответ

Трейлинг = в имени метода идентифицирует метод как метод setter/mutator. Когда вы говорите это в Ruby:

o.p = v

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

o.send(:p=, v)

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

's'.pancakes = 11

дает вам исключение NoMethodError которое жалуется на 's' не имеющий метода pancakes= Строки" (к сожалению) не имеют методов pancakes=.

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

def name=(value)
  @name = value
end

и, возможно, метод name в качестве accessor/getter:

def name
  @name
end
2

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

def name=(value)
  @name = value
end

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

attr_writer :name
1

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

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню