有没有办法在 Ruby 中定义新文字?
Is there a way to define new literal in Ruby?
例如,here 是定义的 ruby 文字的列表。 ruby 是否为我们提供了一种定义新 "custom" 的方法?
[更新]
目的是简化对象实例化的过程。例如,如果我想基于某种动态语言创建对象,我希望有这样的东西:
obj = @|
rule1 = "..."
rule2 = "..."
value1 = "..."
value2 = "..."
|
而不是
hash = {rule1: "...", rule2: "...", value1: "...", value2: "..."}
obj = MyObj.new(hash)
没有。无法在 Ruby 程序中更改 Ruby 的语法。
如果你想定义一个新的文字,你必须在 Ruby bugtracker 上提出它,说服 matz 这是个好主意,然后说服 YARV 的开发者,JRuby , Rubinius, IronRuby, MRuby, MagLev, Topaz, Cardinal, tinyrb, MacRuby, RubyMotion, BlueRuby, Opal, XRuby、Ruby.NET、Alumina、SmallRuby 或您关心的任何实现,然后等待社区更新到更新版本的实现。
如果您的意思是 Ruby,则不能。但是如果你的意思是在 C 中,你可以。
i'd like to have something like this:
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
例如,here 是定义的 ruby 文字的列表。 ruby 是否为我们提供了一种定义新 "custom" 的方法?
[更新] 目的是简化对象实例化的过程。例如,如果我想基于某种动态语言创建对象,我希望有这样的东西:
obj = @|
rule1 = "..."
rule2 = "..."
value1 = "..."
value2 = "..."
|
而不是
hash = {rule1: "...", rule2: "...", value1: "...", value2: "..."}
obj = MyObj.new(hash)
没有。无法在 Ruby 程序中更改 Ruby 的语法。
如果你想定义一个新的文字,你必须在 Ruby bugtracker 上提出它,说服 matz 这是个好主意,然后说服 YARV 的开发者,JRuby , Rubinius, IronRuby, MRuby, MagLev, Topaz, Cardinal, tinyrb, MacRuby, RubyMotion, BlueRuby, Opal, XRuby、Ruby.NET、Alumina、SmallRuby 或您关心的任何实现,然后等待社区更新到更新版本的实现。
如果您的意思是 Ruby,则不能。但是如果你的意思是在 C 中,你可以。
i'd like to have something like this:
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