루비 초보자이며 unit_rows, unit_cols 및 unit_sz이라는 3 개의 인스턴스 변수가있는 클래스를 정의하려고합니다. 이 클래스에서는 unit_rows 및 unit_cols를 외부에서 자유롭게 가져오고 설정할 수있게하려고합니다. 그러나 unit_sz를 (unit_rows * unit_cols)와 같이 계산할 수 있습니다. unit_sz 인스턴스 변수를 다른 클래스에서 가져올 수 있지만 반환되는 값은 행과 열의 곱이어야합니다. I 클래스를 인스턴스화하고 인쇄 할 때루비 클래스 인스턴스 변수 게터 설정 메서드
- 이 제대로 값을 출력 unit_inst.unit_sz :이 클래스는 따라서 내가 동적으로
이 케이스의 모든 인스턴스 변수
을 반복 할 "unit_sz"와 같은 많은 변수로 확장됩니다 제품으로 - "unit_sz"의 getter 메소드를 호출하지 않을 때 동적으로 인스턴스 변수를 반복하고 값을 출력하는 returnVars 메소드를 호출 할 때 기본값 인 "6"의 올바르지 않은 대답을 얻습니다. 생성자에서
- 나는 "unit_ sz "및 인스턴스 변수를 동적으로 반복하고 값을 인쇄하는 returnVars 메서드를 호출 할 때 올바른 제품을 얻습니다.
- 명시 적으로"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}"
하이 자크, 감사합니다 : 당신은 상수 (
MY_VAR = 5
), 또는 개인 방법 (I 선호)를 사용 할 수 있습니다. 내가 unit_sz (및 많은 다른 것들)가 인스턴스 변수가되기를 바랬던 이유는 외부로부터 메소드를 계속 호출하고 싶지 않기 때문에 명시 적으로 메소드를 호출하는 대신 종속 변수를 자동으로 계산하는 것이 훨씬 쉬울 것입니다. 또한, 나는 모든 변수를 반복하고 인쇄하도록했습니다. 그동안, 나는 무엇을했는지 인스턴스 변수를 루핑하는 동안 'val = eval ("self. # {key}")'를 수행했습니다. 저는 self.variable name이 "getter"메소드를 호출한다고 생각합니다. – user2805732또한 두 번째 부분에서는 상수가 필요하지 않지만 메서드 호출 순서에 따라 여러 메서드에서 변경할 수있는 전용 변수가 있습니다. – user2805732
키의 첫 번째 문자를 제거하여 "@" – user2805732