2013-07-15 3 views
3

포함하는 메서드 내에서만 액세스 할 수있는 상수를 만들고 싶습니다. 다른 언어에서 하나는이 작업을 수행 할 수 있습니다 두 가지 방법 MAX에서Ruby에서 메소드 범위 상수를 만들 수 있습니까?

void function() 
{ 
    const int MAX = 25; 
    int array[MAX]; 

    //DO SOMETHING 
} 
void function2() 
{ 
    const int MAX = 50; 
    int array[MAX]; 
    //DO SOMETHING ELSE 
} 

클래스에 글로벌 없습니다. 데이터 숨김을 믿고 Ruby에서이 작업을 수행 할 수있는 방법이 있는지 알고 싶습니다. 메소드 내에서 상수를 생성 할 수 있습니까?

+0

왜 이렇게해야하는지 궁금합니다. 확실히 메서드 내에서 생성하는 경우 수정하지 않는 메서드에서 변수를 만들면됩니다. –

+0

값이 일정한 것으로 알려진 경우 코드를 훨씬 쉽게 읽을 수 있습니다. 나는 MAX를보고 그것의 상수를 안다. 나는 최대를 본다. 그리고 나는 그것이 계산된다고 생각한다. 내 동료는 친환경 목초지로 떠난 지 6 개월 후에 제 코드를보고 내 의도를 알고 있습니다. – baash05

+0

@ baash05, 이상한 것, 동적 상수는 어떨까요? 나는 그것에 대한 나의 대답을 향상시켰다. ;) –

답변

2

당신은 그렇게 할 수 없습니다. 문제는 상수가 비공개인지 아닌지에 관한 것이 아닙니다. Ruby는 메소드 정의에서 상수 생성을 금지합니다.

def foo 
    Foo = :foo 
end 
# => SyntaxError: ... dynamic constant assignment 
+0

class_eval을 통해 런타임에 상수를 할당하는 것은 어떨까요? –

+0

@JeslyVarghese 가능합니다. 그러나 그것은 도움이되지 않습니다. – sawa

1

약간의 모순이 있고 그 아이디어가 이상한데, 동적 상수는 어떨까요?

class FOO 
    def method 
    method_constant :METHOD_CONSTANT, 25 
    METHOD_CONSTANT 
    end 
    def method_constant(constant_name, value) 
    constant_name.to_s.slice!(0,1) 
    FOO.class_eval "#{constant_name} = #{value}" 
    FOO.class_eval "private_constant :#{constant_name}" 
    end 
    private :method_constant 
end 

f = FOO.new 
f.method #:=>25 
FOO::METHOD_CONSTANT #:=>error 

글쎄, 이러한 상수는 정의 된 방법의 범위를 벗어나 사용할 수 있습니다. 한 가지는 확실하지 않은 경우, 얼마나 많은 OOPS의 법칙이 끊임없이 중단 될 것인가입니다!

+0

당신은 개인 상수를 가질 수는 있지만 그들은 OP와 같은 메서드 내에서가 아니라 다른 상수 내에서 범위가 지정됩니다. –

+0

@ 앤드류 마샬 : 와우! 나에게 새로운. 더 깊이 설명해 주시겠습니까? ** 다른 상수 내에서 범위가 ** 나를 혼란스럽게합니다. 그래서 당신은 개인으로 원하는 상수를 캡슐화하는 상수로 객체를 가지고있는 한 계속됩니까? –

+0

주어진'module A; 모듈 B; 종료; private_constant : B; 'A :: B '는'A '의 범위 내에서만 참조 할 수 있습니다. –

3

아니, 당신은 할 수 없습니다,하지만 당신은 루비 상수가 정말 일정하지 않기 때문에 많은 포인트가 없을 것입니다 수있는 경우에도 :

MY_CONST = 'foo' 
MY_CONST << 'bar' 
MY_CONST #=> 'foobar' 
MY_CONST = 'baz' # warning: already initialized constant MY_CONST 

당신은 그 자체가되는 개체에 대한 걱정 경우를 개체를 반환하는 경우보다 의미가있는 참조가 아니라 개체가 변형 된 것을 방지하기 위해 개체를 freeze으로 바꿀 수 있습니다 (깊은 동결에 대해서는 얕은 동결이지만 IceNine 참조) .

관련 문제