声明Ruby对象的特殊语法

时间:2012-02-04 20:04:15

标签: ruby object

每个人都知道创建空数组的两种方法:Array.new[]。你会说,第一个是'标准',第二个是语法糖。通过此方法可以缩短许多不同的对象,例如Hash甚至String

我的问题是:有没有办法为对象定义自己的分隔符?一个例子是<>。可能是'<' => 'MyObject.new(''>' => ')'这样的别名?

3 个答案:

答案 0 :(得分:1)

没有。 (无论如何。)分隔符是解析过程的一部分。

您可以定义运算符,例如<;这与分隔符不同。例如,您可以重新定义<以获取块,并使用该块创建类或方法等。但是......我认为不会。

答案 1 :(得分:1)

[]数组文字{}哈希文字。 Ruby中有很多这些速记形式。请查看this wikibook以获取更多信息。

没有对象字面值,但您可以使用(source):

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

答案 2 :(得分: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>

我想不出更紧凑的东西。