Специальный синтаксис для объявления объектов Ruby - PullRequest
0 голосов
/ 05 февраля 2012

Каждый знает два способа создания пустого массива: Array.new и []. Вы можете сказать, что первый - «стандартный», а второй - просто синтаксический сахар. Многие различные объекты, такие как Hash и, возможно, даже String, сокращаются с помощью этого метода.

Мой вопрос: есть ли способ определить мои собственные разделители для объектов? Примером будет <>. Может быть, псевдоним типа '<' => 'MyObject.new(' и '>' => ')'?

Ответы [ 3 ]

1 голос
/ 05 февраля 2012

[] - это литерал массива , {} - это хеш-литерал . В Ruby существует множество таких сокращенных форм. Проверьте этот wikibook для получения дополнительной информации.

Нет литерала объекта, но вы можете использовать ( source ):

a = Struct.new(:foo,:bar).new(34,89)
a.foo # 34
a.bar # 89
1 голос
/ 05 февраля 2012

Вы можете сделать:

class MyObject; end

def [](*args)
  MyObject.new *args
end

# but you can't use it directly:
o = []       #=> [] (empty Array)

# you must to refer to self:
o = self[]   #=> #<MyObject:0x1234567>

# but since self depends on where are you, you must assign self to a global variable:
$s = self
o = $s[]

# or to a constant:
S = self
o = S[]

# however, in that case it's better to do it in the proper class:
class << MyObject
  def [](*args)
    new *args
  end
end

# and assign it to a single-letter constant to reduce characters:
S = MyObject

# so
o = S[]    #=> #<MyObject:0x1234568>

Я не могу думать о чем-то более компактном.

1 голос
/ 05 февраля 2012

Нет. (И все равно.) Разделители являются частью процесса синтаксического анализа.

Вы можете определить операторы, такие как <; это отличается от разделителя. Например, вы можете переопределить <, чтобы взять блок, и использовать этот блок для создания класса или метода и т. Д. Но ... я не думаю, что смог бы.

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