Предположим, что кто-то хотел создать класс, имеющий переменную экземпляра класса, метод получения этой переменной, метод класса и метод экземпляра.Можно написать следующее:
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 от введения ключевого слова, которое будет использоваться таким образом.