2015-01-12 4 views
-1

안녕하세요 (n)은 측면의 간단한 다이에 대한 코드를 작성하고 있는데 그것을 잘 작동합니다 :인스턴스 루비

class Die 

    def initialize(sides) 
    @sides = sides 
    raise ArgumentError if sides < 1 
    end 

    def roll 
    roll_number = rand(@sides) + 1 
    end 
end 

을하지만, 내가 클래스 인스턴스에서 내 초기화 변수를 변경할 때 생성 된 난수는 정수에서 작은 부동 소수점 수로 바뀝니다.

class Die 

    def initialize(sides) 
    HERE --> @@sides = sides 
    raise ArgumentError if sides < 1 
    end 

    def roll 
    roll_number = rand(@sides) + 1 
    end 

end 

이 차이가 발생할 수있는 원인을 알고 싶습니까?

답변

0

코드에 오류가 있습니다. Die의 두 번째 버전에서는 실제로 roll 메서드에서 올바른 변수를 호출하지 않습니다.

그것은해야한다 :

대신
def roll 
    roll_number = rand(@@sides) + 1 
    end 

은 당신이로 평가했다 : 당신이 인수 랜드를 제공하지 않을 경우 rand 라이브러리에 따르면

roll_number = rand(nil) + 1 

는 의사 난수 부동 소수점 수를 반환 0.0과 1.0을 포함하며, 0.0을 포함하고 1.0을 제외합니다.

1

두 번째 코드 스 니펫에서 @@sides 클래스 변수를 초기화하지만 @sides이라는 인스턴스 변수를 여전히 rand()으로 전달합니다. @sides이 초기화되지 않았으므로 rand()을 호출하면 nil이 전달되므로 Kernel#rand은 정수 대신 float를 제공합니다.

관련 문제