大家都知道創建空數組的兩種方法:Array.new
和[]
。第一個是'標準',你可能會說,第二個是簡單的語法糖。許多不同的對象,如Hash
,甚至String
通過這種方法是短命的。用於聲明Ruby對象的特殊語法
我的問題是:有沒有一種方法來定義我自己的對象定界符?一個例子是<>
。也許像'<' => 'MyObject.new('
和'>' => ')'
的別名?
大家都知道創建空數組的兩種方法:Array.new
和[]
。第一個是'標準',你可能會說,第二個是簡單的語法糖。許多不同的對象,如Hash
,甚至String
通過這種方法是短命的。用於聲明Ruby對象的特殊語法
我的問題是:有沒有一種方法來定義我自己的對象定界符?一個例子是<>
。也許像'<' => 'MyObject.new('
和'>' => ')'
的別名?
[]
爲數組文本,{}
爲散列字面。 Ruby中有很多簡寫形式。查看this wikibook瞭解更多信息。
沒有對象文本,但您可以使用(source):
a = Struct.new(:foo,:bar).new(34,89)
a.foo # 34
a.bar # 89
第(而且無論如何。)分隔符是解析過程的一部分。
您可以定義運算符,如<
;這與分隔符不同。例如,您可以重新定義<
以取得塊,並使用該塊創建類或方法等。但是...我不認爲我會這樣做。
你可以這樣做:
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>
我想不到的東西更緊湊。
這裏的目標不是發現定義對象最簡約的方式。我只是想看看是否可以定義文字。 – itdoesntwork 2012-02-05 05:24:35
Aww ...我希望得到像C/C++預處理器那樣的東西:) – itdoesntwork 2012-02-04 20:11:22
@itdoesntwork然後使用預處理器,但我認爲你在咆哮一棵樹,它很容易落到你身上,憐憫。 – 2012-02-04 20:13:42
嗯,我沒有打算這麼做;這是假設。我可以想象它可能導致的一些問題。 – itdoesntwork 2012-02-04 22:02:04