Может ли введение ключевого слова "singleton_class" нарушить код Ruby или вызвать другие трудности? - PullRequest
0 голосов
/ 03 февраля 2019

Предположим, что кто-то хотел создать класс, имеющий переменную экземпляра класса, метод получения этой переменной, метод класса и метод экземпляра.Можно написать следующее:

class C
  @v = 1

  def hi
    'hi'
  end

  class << self
    attr_reader :v

    def ho
      'ho'
    end
  end
end

C.methods(false)
  #=> [:v, :ho]
C.ho
  #=> "ho" 
C.v
  #=> 1

Конечно, это можно написать многими другими способами.Например:

class C
  @v = 1

  def hi
    'hi'
  end

  def self.ho
    'ho'
  end

  singleton_class.class_eval do
    attr_reader :v
  end
end

C.methods(false)
  #=> [:v, :ho]
C.ho
  #=> "ho" 
C.v
  #=> 1

В обоих случаях class << self и singleton_class.class_eval приводят к изменению self с C на C.singleton_class.Предположим, что было ключевое слово singleton_class, которое делало то же самое, позволяя нам написать следующее:

class C
  @v = 1

  def hi
    'hi'
  end

  singleton_class 

  attr_reader :v

  def ho
    'ho'
  end
end

C.methods(false)
  #=> [:v, :ho]
C.ho
  #=> "ho" 
C.v
  #=> 1

Можно было бы иметь другое ключевое слово, которое позволяло бы self переключаться между Cи его одноэлементный класс, но, возможно, было бы проще требовать, чтобы все после singleton_class было связано с одноэлементным классом.

Казалось бы, не возникнет конфликта между использованием ключевого слова singleton_class и локальнымпеременные или методы с тем же именем.Рассмотрим, например, использование ключевого слова private: (После написания следующего я узнал, что мое давнее убеждение в том, что private является ключевым словом, неверно; это метод Module # private используется без аргумента. Я оставляю это здесь, как указано в комментариях.)

class C
  def m
    private = 'hi'
    private
  end
  private :m

  private
  def private
    'ho'
  end
end
c = C.new
c.m
  #=> NoMethodError (private method `m' called...
c.send :m
  #=> "hi"
c.private
  #=> NoMethodError (private method `private' called...
c.send :private
  #=> "ho"

Мой вопрос дан в названии.Не стесняйтесь также высказать мнение о том, выиграет ли Ruby от введения ключевого слова, которое будет использоваться таким образом.

1 Ответ

0 голосов
/ 03 февраля 2019

Да.Введение нового ключевого слова всегда нарушает существующий код.

Раньше, что бы вы ни вводили, было допустимым идентификатором, теперь это не так.

Именно поэтому ключевые слова очень "дороги""и должен использоваться очень экономно.(У Руби их уже слишком много, ИМО).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...