2010-02-19 2 views
5

다음 사람이 나를 이해할 수있게 도와 줄 수 있습니까? IRB에 다음클래스가 자동으로 선언 된 메서드가 선언 되었습니까?

class Dog 
end 
// bark is declared outside of Dog class 
def bark 
    puts 'Woof!' 
end 

: 나는 test.rb에 다음 코드를

>> source 'test.rb' 
>> a = Dog.new 
=> #<Dog:0x117f614> 
>> a.bark 
Woof! 
=> nil 

않는 이유는이 클래스의 외부에서 선언 된 경우에도 개 인스턴스에 존재 bark 방법은? 같은 파일에 있기 때문에? 감사!

답변

3

, 그 방법은 Object의 개인 방법을 만들어 Dog :

따라서 개 (실제로 모든 개체)는 이제 짖는 법을 알고 있습니다. 그러나, 개인되는 방법은, 당신은 명시 적으로 수신기로 전화를 instance_eval 사용해야합니다 :

dog.instance_eval { bark } # => "Woof!" 

또는 당신은 필요하지 체조와 암시 수신기를 호출 할 수 있습니다

bar # => "Woof!" 
+0

감사합니다, 감사합니다! – penger

1

정확한 예가 Ruby 1.9에서 작동하지 않습니다. (그렇다 나쁜 주석 구문에서.)

그러나, 최상위 레벨 범위에 방법을 선언하는 Object에 개인 방법 것, 분명히 : 당신의 루비 아마도

>> Object.private_methods.include? :bark 
=> true 

(1.8?) 이것은 공개 방법입니까?

#!/usr/bin/ruby1.8 

class Dog 
end 

p Object.respond_to?(:bark, true)  # => false 

def bark 
    puts "Woof!" 
end 

p Object.respond_to?(:bark, true)  # => true 

개체 모든 객체의 조상 체인에 포함 : 당신이 (모든 클래스의 외부)은 "글로벌"범위의 방법을 만들 때

+0

그것은이다 1.8에서도 공개되지 않았습니다. 나는 왜 OP의 코드가 "private method bark"라고 불평하지 않았는지 모르겠다. 그것은 irb "source"라인과 관련이 있습니다. 나는 그것이 "요구하는 것"과 다른 것을 모릅니다. –

+0

(1.8.7에서) 이것이 사실 인 것처럼 보입니다 - 소스 대신에 필요한 경우 실제로 오류가 발생합니다. 소스는 배시 (bash) 내장 파일과 같을 것입니다.이 파일은 입력 된 것처럼 파일의 내용을 포함하므로 개인적인 방법으로 액세스 할 수 있습니다. – Shadowfirebird