有没有办法在Ruby中定义新的文字?

时间:2015-02-12 13:13:53

标签: ruby literals

例如,here是已定义的ruby文字列表。 ruby是否为我们提供了一种定义新“自定义”的方法?

[更新] 目的是简化对象实例化的过程。例如,如果我想基于某种动态语言创建对象,我希望有这样的东西:

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

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

而不是

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

3 个答案:

答案 0 :(得分:6)

没有。没有办法在Ruby程序中更改Ruby的语法。

如果你想定义一个新的文字,你必须在Ruby bugtracker上提出它,说服matz这是个好主意,然后说服YARV,JRuby,Rubinius,IronRuby,MRuby,MagLev,Topaz的开发者, Cardinal,tinyrb,MacRuby,RubyMotion,BlueRuby,Opal,XRuby,Ruby.NET,Alumina,SmallRuby,或者您关心实现它的任何实现,然后等待社区更新到更新版本的实现。

答案 1 :(得分:4)

  

我想要这样的事情:

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

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

你可以用Ruby的内置语法(好吧,差不多)来做到这一点:

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

答案 2 :(得分:0)

如果你的意思是Ruby,你就不能。但如果你的意思是C,你可以。