2012-02-04 4 views
0

빈 배열을 만드는 두 가지 방법은 모두 Array.new[]입니다. 첫 번째 것은 '표준'이며, 두 번째 것은 단순한 구문 설탕입니다. Hash 및 심지어 String과 같은 많은 다른 객체는이 방법을 통해 약식으로 표현됩니다.Ruby 객체를 선언하기위한 특수 구문

내 질문은 : 개체에 대한 내 자신의 delimimers 정의 방법이 있습니까? 예는 <>입니다. 별칭은 '<' => 'MyObject.new(''>' => ')'일까요?

답변

1

[]는이 배열 리터럴{}해시가 리터럴이다. 루비에는 이러한 단축형이 많이 있습니다. 자세한 내용은 this wikibook을 확인하십시오.

가 문자 그대로 어떤 물체가 없지만, 당신이 (source)를 사용할 수는 :

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

No. (어쨌든간에) 구분 기호는 구문 분석 프로세스의 일부입니다.

<과 같은 연산자를 정의 할 수 있습니다. 그건 구분 기호와 다릅니다. 예를 들어 <을 다시 정의하여 블록을 사용하고 해당 블록을 사용하여 클래스 또는 메서드 등을 만들 수 있습니다.하지만 ... 나는 그렇게 생각하지 않습니다.

+0

Aww ... 나는 C/C++ preproccesor와 같은 것을 원했다. :) – itdoesntwork

+0

@itdoesntwork 그렇다면 전처리기를 사용하라. 그러나 나는 너를 넘어서서 너를 무너 뜨리는 나무를 짖고 있다고 생각한다. 자비. –

+0

글쎄, 나는 그 일을 할 계획이 아니었다. 그것은 가설 적이 었습니다. 나는 그것이 초래할지도 모르는 약간의 문제를 상상할 수있다. – itdoesntwork

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