2015-02-12 3 views
2

Например, here - это список определенных рубиновых литералов. Рубин дает нам способ определить новую «обычную»?Есть ли способ определить новый литерал в Ruby?

[Обновлено] Целью является упрощение процесса создания объекта. Например, если я хочу, чтобы создать объект на основе некоторого динамического языка я хотел бы иметь что-то вроде этого:

obj = @| 
    rule1 = "..." 
    rule2 = "..." 

    value1 = "..." 
    value2 = "..." 
| 

вместо того

hash = {rule1: "...", rule2: "...", value1: "...", value2: "..."} 
obj = MyObj.new(hash) 
+3

Зачем вам когда-либо понадобится d o это? Просьба представить практический пример проблемы, с которой вы сталкиваетесь. –

+1

Добавление новых лексических конструкций на самом деле не вопрос необходимости, а удобства. Несмотря на то, что это может быть обескуражено, люди по-прежнему в конечном итоге исправляют основные классы. Пользовательские литералы, испеченные на этом языке, помогли бы стандартизировать эту практику и сделать ее более понятной. –

ответ

6

No. Там нет никакого способа изменить синтаксис Ruby в рубиновой программе.

Если вы хотите определить новый литерал, вы должны предложить его на багтрекер Ruby, убедите matz, что это хорошая идея, а затем убедите разработчиков YARV, JRuby, Rubinius, IronRuby, MRuby, MagLev, Topaz , Cardinal, tinyrb, MacRuby, RubyMotion, BlueRuby, Opal, XRuby, Ruby.NET, Alumina, SmallRuby или любую другую реализацию, которую вы хотите реализовать, а затем подождите, пока сообщество обновится до более новых версий реализаций.

+1

Я бы добавил, что вместо литералов нужно подклассы и создавать собственную собственную реализацию того, что им нужно было сделать. Разумеется, с доступными литералами нужно быть в состоянии достичь необходимой им функциональности. – David

0

Если вы имеете в виду в Ruby, вы не можете. Но если вы имеете в виду на C, вы можете.

4

я хотел бы иметь что-то вроде этого:

obj = @| 
    rule1 = "..." 
    rule2 = "..." 

    value1 = "..." 
    value2 = "..." 
| 

Вы можете сделать это с рубин встроенный в синтаксисе (ну, почти):

obj = MyObj.build { 
    rule1 'foo' 
    rule2 'bar' 

    value1 'baz' 
    value2 'qux' 
} 

obj #=> #<MyObj:0x007fcd7d01ee90 @rule1="foo", @rule2="bar", @value1="baz", @value2="qux"> 

Реализация:

class Builder 
    def initialize(obj) 
    @obj = obj 
    end 

    def method_missing(name, value) 
    @obj.public_send("#{name}=", value) 
    end 
end 

class MyObj 
    attr_accessor :rule1, :rule2, :value1, :value2 

    def self.build(&block) 
    new.tap { |obj| Builder.new(obj).instance_eval(&block) } 
    end 
end 
+0

Хорошее решение. Почти то, что я искал. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^