2012-02-04 33 views
0

大家都知道創建空數組的兩種方法:Array.new[]。第一個是'標準',你可能會說,第二個是簡單的語法糖。許多不同的對象,如Hash,甚至String通過這種方法是短命的。用於聲明Ruby對象的特殊語法

我的問題是:有沒有一種方法來定義我自己的對象定界符?一個例子是<>。也許像'<' => 'MyObject.new(''>' => ')'的別名?

回答

1

[]數組文本{}散列字面。 Ruby中有很多簡寫形式。查看this wikibook瞭解更多信息。

沒有對象文本,但您可以使用(source):

a = Struct.new(:foo,:bar).new(34,89) 
a.foo # 34 
a.bar # 89 
1

(而且無論如何。)分隔符是解析過程的一部分。

您可以定義運算符,如<;這與分隔符不同。例如,您可以重新定義<以取得塊,並使用該塊創建類或方法等。但是...我不認爲我會這樣做。

+0

Aww ...我希望得到像C/C++預處理器那樣的東西:) – itdoesntwork 2012-02-04 20:11:22

+0

@itdoesntwork然後使用預處理器,但我認爲你在咆哮一棵樹,它很容易落到你身上,憐憫。 – 2012-02-04 20:13:42

+0

嗯,我沒有打算這麼做;這是假設。我可以想象它可能導致的一些問題。 – itdoesntwork 2012-02-04 22:02:04

1

你可以這樣做:

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> 

我想不到的東西更緊湊。

+0

這裏的目標不是發現定義對象最簡約的方式。我只是想看看是否可以定義文字。 – itdoesntwork 2012-02-05 05:24:35