2013-10-21 2 views
1
class Collie 
    def speak 
     puts dog_generic 
    end 
end 

class Greyhound 
    def speak 
     puts dog_generic 
    end 
end 

class Labrador 
    def speak 
     puts dog_generic 
    end 
end 

dog_generic = "Woof" 

chep = Collie.new 
wrex = Collie.new 
speedy = Greyhound.new 
faithful = Labrador.new 

chep.speak #=> Woof 
wrex.speak #=> Woof 
speedy.speak #=> Woof 
faithful.speak #=> Woof 

나는 "우프"를 반환하는 마지막 3 가지 방법을 원합니다. 그러나이 코드는 정의되지 않은 변수 dog_generic 오류를 호출합니다. 이것은 전역 변수조차도 객체에 사용할 수 없기 때문인 것으로 보인다. dog_generic의 모든 인스턴스를 @@dog_generic으로 변경하면 작동하지만 거의 작동하지 않으며 그 작업만으로는 내가 잘못하고 있다고 생각할 수 없습니다.여러 객체간에 하나의 변수 공유하기

여러 개체간에 하나의 변수를 공유하려면 어떻게해야합니까?

아니요. 매개 변수로 모든 단일 개체에 "우위"문자열을 전달하고 싶지 않습니다.

+0

PHP에서 이것을하고 있었습니까? 저는'dog'라는 이름의 클래스 하나를 만들고 변수'dog_generic'과 메서드'speak'를 포함 시켰습니다. 그런 다음'Collie','Greyhound'와'Labrador' 클래스를 새로 만들 것입니다. Dog에서 상속받은 것. 후회 루비에서이 작업을 수행하는 방법을 모르지만, 실마리를 제공하기를 바랍니다. –

+1

'dog_generic'의 모든 인스턴스 앞에'$ dog_generic'처럼 달러 기호를 붙이면 원하는 동작을 얻을 수 있습니다. perimosocordiae의 대답에 따라 상속을 사용하는 것이 더 좋은 방법입니다. –

+0

상수'DOG_GENERIC = "Woof"를 만들 수 있습니다. – mwoods79

답변

6

일반적으로 하나의 행동 이런 종류의를 제공하기 위해 상속을 사용 :

class Dog 
    def speak 
     puts "Woof" 
    end 
end 

class Collie < Dog 
    # whatever behavior that is specific to Collie here 
end 

chep = Collie.new 
chep.speak #=> Woof 
+1

나를 이길. :-) Graffiker, 이것은 클래스와 하위 클래스의 이유 중 하나입니다. 특정 하위 클래스에 대해 원할 경우 메서드'speak'를 재정의 할 수도 있습니다. – Beartech

4

당신은 루비에서 전역 변수가 무엇인지에 대한 혼란을 갖고있는 것 같다. 당신은 $의시길로, 명시 적으로 글로벌 만들어야 라

$dog_generic = 'Woof' 

및 글로벌 아마 여기에 최악의 방법입니다 사용했다

def speak 
    puts $dog_generic 
end 

. 일반 개 클래스를 정의하고 특정 유형을 상속 받거나, 개 믹스를 만들고 포함 시키면 더 나은 해결책이 될 것입니다.

1

상수로 지정하십시오. 대문자로 시작하는 변수는 상수입니다. 클래스를 포함하여 상수는 전 세계적으로 범위가 지정 될 수 있습니다. class Foo; end은 클래스를 가리키는 상수이며, Foo = Class.new으로 쓸 수도 있습니다. 내가 @perimosocordiae에 동의

class Collie 
    def speak 
    puts DOG_GENERIC 
    end 
end 

class Greyhound 
    def speak 
    puts DOG_GENERIC 
    end 
end 

class Labrador 
    def speak 
    puts DOG_GENERIC 
    end 
end 

DOG_GENERIC = "Woof" 

chep = Collie.new 
wrex = Collie.new 
speedy = Greyhound.new 
faithful = Labrador.new 

chep.speak #=> Woof 
wrex.speak #=> Woof 
speedy.speak #=> Woof 
faithful.speak #=> Woof 

, 당신은 아마 상속을 사용해야합니다. 나는 상속을위한 계급의 사용에 관해서는 그와 동의하지 않을 것이다. 루비의 모듈은 상속 체인에 포함되어 있지만 생성자가 없습니다 (추상 클래스라고 생각할 수 있지만 여러 모듈을 상속 할 수 있음). 다른 사람들이 Dog를 서브 클래스에 대한 귀하의 질문에 대답하는 동안

module Speach 
    WOOF = "Woof" 
    QUACK = "Quack" 

    module Dog 
    def speak 
     puts WOOF 
    end 
    end 

    module Duck 
    def speak 
     puts QUACK 
    end 
    end 
end 

class Collie 
    include Speach::Dog 
end 

class Greyhound 
    include Speach::Dog 

    # can overwrite ancestor 
    def speak 
    puts "Ruff" 
    end 
end 

class Mallard 
    include Speach::Duck 
end 

Collie.new.speak # => "Woof" 
Greyhound.new.speak # => "Ruff" 
Mallard.new.speak # => "Quack" 
0

, 당신의 인스턴스 이름을 지정하는 더 좋은 방법을 소개하고 싶습니다 : NameMagic. 또한 인스턴스와 이름을 조회 할 수 있습니다

Dog.instances.each &:speak 
#=> Woof 
#=> Woof 
#=> Woof 
#=> Woof 

NameMagic : 명령 행에서 gem install y_support을 입력하여 NameMagic에게 그것을 필요 : 다음

class Dog 
    include NameMagic 
    def speak 
    puts "Woof" 
    end 
end 

Collie = Class.new Dog 
Greyhound = Class.new Dog 
Labrador = Class.new Dog 

Chep = Collie.new 
Wrex = Collie.new 
Speedy = Greyhound.new 
Faithful = Labrador.new 

그리고 :

require 'y_support/name_magic' 

그리고 :

Dog.instances 
#=> [#<Collie:0xb90e3c38>, #<Collie:0xb90e1adc>, #<Greyhound:0xb90e7860>, #<Labrador:0xb90e5574>] 
Collie.instances 
#=> [#<Collie:0xb90e3c38>, #<Collie:0xb90e1adc>] 
Labrador.instances 
#=> [#<Labrador:0xb90e5574>] 
Dog.instance_names 
#=> [:Chep, :Wrex, :Speedy, :Faithful] 
Collie.instance_names 
#=> [:Chep, :Wrex] 
관련 문제