2014-02-11 6 views
0

루비 초보자이며 unit_rows, unit_cols 및 unit_sz이라는 3 개의 인스턴스 변수가있는 클래스를 정의하려고합니다. 이 클래스에서는 unit_rows 및 unit_cols를 외부에서 자유롭게 가져오고 설정할 수있게하려고합니다. 그러나 unit_sz를 (unit_rows * unit_cols)와 같이 계산할 수 있습니다. unit_sz 인스턴스 변수를 다른 클래스에서 가져올 수 있지만 반환되는 값은 행과 열의 곱이어야합니다. I 클래스를 인스턴스화하고 인쇄 할 때루비 클래스 인스턴스 변수 게터 설정 메서드

  1. 이 제대로 값을 출력 unit_inst.unit_sz :이 클래스는 따라서 내가 동적으로

    이 케이스의 모든 인스턴스 변수

    을 반복 할 "unit_sz"와 같은 많은 변수로 확장됩니다 제품으로
  2. "unit_sz"의 getter 메소드를 호출하지 않을 때 동적으로 인스턴스 변수를 반복하고 값을 출력하는 returnVars 메소드를 호출 할 때 기본값 인 "6"의 올바르지 않은 대답을 얻습니다. 생성자에서
  3. 나는 "unit_ sz "및 인스턴스 변수를 동적으로 반복하고 값을 인쇄하는 returnVars 메서드를 호출 할 때 올바른 제품을 얻습니다.
  4. 명시 적으로"self.unit_sz "를 호출하면 값이 올바르게 인쇄되지만 동적으로 수행 할 수는 없습니다.

외부에서 호출하고 클래스 "returnVars"메소드의 인스턴스 변수를 동적으로 반복 할 때 "unit_sz"인스턴스 변수가 제품으로 올바르게 계산되도록하려면 어떻게해야합니까?

또한 meth1과 meth2 (값을 전달하지 않고)를 사용할 수 있지만 외부에서는 액세스 할 수없는 로컬 클래스 변수를 어떻게 선언합니까? getter/setter없이 클래스 인스턴스 변수를 정의하여 작동하도록 할 수 있습니다 - 올바른 방법입니까?

미리 감사드립니다. 그냥하는 방법으로 처리 할 수 ​​있습니다 -

다음은 이유가 @unit_sz는 인스턴스 변수가 될 필요가있다 (나는 당신의 질문에서 볼 수) 없다 내 코드

#!/usr/local/bin/ruby -w 
class Unit 

def initialize 
@unit_cols = 2 
@unit_rows = 2 

@unit_sz = 6 
end 

attr_accessor :unit_cols, :unit_rows 
#attr_reader :unit_sz 

def unit_sz 
    @unit_sz = @unit_rows * @unit_cols 
end 

def returnVars 
    ret_str = "" 
    temp = self.instance_variables 
    for param in temp 
     key = param.to_s 
     val = instance_variable_get(("" + key).intern) 
     key = key[1..-1] 
     ret_str << "#{key.upcase} = #{val.to_s};" << "\n" 
    end 
    puts "check1 = #{self.unit_sz}" 
    return ret_str 
end 

#meth1 
def meth1 


end 

#meth2 
def meth2 


end 
end 

unit = Unit.new 
#puts "unit_sz = #{unit.unit_sz}" 
puts "#{unit.returnVars}" 

답변

0

입니다. 거기 당신은 바르 (캐싱, 메모이 제이션 등)을 설정할 수 있습니다 경우가 있지만,이 간단한 경우에, unit_sz는해야한다 :이 방법 대신 직접 인스턴스 변수에 액세스하는 접근을 사용하는

def unit_sz 
    unit_rows * unit_cols 
end 

참고. 일반적으로 값은 메시지 전송의 결과이므로 클래스를 확장하거나 확장 할 때 이점을 활용할 수 있으므로이 방법이 좋습니다. 인스턴스 변수는 initialize 또는 개별 설정자에서 설정해야하지만 일반적으로 다른 곳에서는 설정하지 않아야합니다.

모든 인스턴스 변수를 반복 할 때 사용자 정의 inspect 메쏘드를 본질적으로 만들고 있지만, 미리 정의한 인스턴스 변수를 모르는 경우가 있습니다. 여기서 문제는 행동과 데이터가 합쳐져 ​​있다는 것입니다. 클래스의 구조 (인스턴스 변수 및 메서드)는 동작을 정의해야하며 변수는 데이터를 보유해야하지만 변수 개수가 다양하기 때문에 특정 인스턴스의 구조가 데이터 쪽을 향하고 기울어집니다. 임의의 수의 키 - 값 쌍이 필요하면 대신 해시를 사용하십시오. 그러나 @unit_sz 문제가 이미 처리 되었기 때문에 나는 당신이 그렇게 생각하지 않습니다.

마지막 질문은 정적 변수 (예 : getter 또는 setter가 없으므로 클래스에서 정의한 값)를 정의하는 것입니다. 답변에 대한

class Unit 

    private 

    def my_var 
    5 
    end 
end  
+0

하이 자크, 감사합니다 : 당신은 상수 (MY_VAR = 5), 또는 개인 방법 (I 선호)를 사용 할 수 있습니다. 내가 unit_sz (및 많은 다른 것들)가 인스턴스 변수가되기를 바랬던 이유는 외부로부터 메소드를 계속 호출하고 싶지 않기 때문에 명시 적으로 메소드를 호출하는 대신 종속 변수를 자동으로 계산하는 것이 훨씬 쉬울 것입니다. 또한, 나는 모든 변수를 반복하고 인쇄하도록했습니다. 그동안, 나는 무엇을했는지 인스턴스 변수를 루핑하는 동안 'val = eval ("self. # {key}")'를 수행했습니다. 저는 self.variable name이 "getter"메소드를 호출한다고 생각합니다. – user2805732

+0

또한 두 번째 부분에서는 상수가 필요하지 않지만 메서드 호출 순서에 따라 여러 메서드에서 변경할 수있는 전용 변수가 있습니다. – user2805732

+0

키의 첫 번째 문자를 제거하여 "@" – user2805732