Program Club

이 Ruby 객체에 동일한 작업을 수행하는 것처럼 보이는 to_s 및 inspect 메서드가 모두있는 이유는 무엇입니까?

proclub 2020. 11. 27. 21:40
반응형

이 Ruby 객체에 동일한 작업을 수행하는 것처럼 보이는 to_s 및 inspect 메서드가 모두있는 이유는 무엇입니까?


이 Ruby 객체 가 동일한 작업을 수행하는 것처럼 보이는 a to_sinspect메소드가 모두있는 이유는 무엇 입니까?

p메서드 는 객체를 나타내는 inspect호출 to_s호출 하고 넣기 / 인쇄 합니다.

내가 달리면

class Graph
  def initialize
    @nodeArray = Array.new
    @wireArray = Array.new
  end
  def to_s # called with print / puts
    "Graph : #{@nodeArray.size}"
  end
  def inspect # called with p
    "G"
  end
end

if __FILE__ == $0
  gr = Graph.new
  p gr
  print gr
  puts gr
end

나는 얻다

G
Graph : 0
Graph : 0
  • 그렇다면 루비에는 왜 같은 일을하는 두 가지 기능이 있습니까? to_s의 차이점은 무엇입니까 inspect?
  • 그리고 무엇의 차이입니다 puts, print그리고 p?

to_s또는 inspect함수를 주석 처리하면 다음과 같이 표시됩니다.

#<Graph:0x100124b88>
#<Graph:0x100124b88>

inspect디버깅 및 to_s최종 사용자 또는 표시 목적으로 더 많이 사용 됩니다.

예를 들어, [1,2,3].to_s그리고 [1,2,3].inspect다른 출력을 생성한다.


inspect기본적으로 클래스 이름, 인스턴스의를 알려주고 object_id인스턴스의 인스턴스 변수를 나열 하는 메서드입니다 .

print그리고 puts당신이 이미 알고있는 객체의 값 넣고, 사용 to_s하는 방법을 STDOUT. Ruby 문서에서 알 수 있듯이 Object#to_s최종 사용자의 가독성을 위해 사용되는 객체를 나타내는 문자열을 반환합니다.

printputs제외한 서로 동일 puts하면서 자동 개행을 추가 print하지 않는다.


파이썬과 비교하기 to_s와 같습니다 __str__inspect같다 __repr__. to_s문자열을 제공하는 반면 inspect객체의 문자열 표현을 제공합니다. 원하는 경우 후자를 사용하여 객체를 구성 할 수 있습니다.


또한 to_str특정 개체에 대한 메서드가 있는데, 문자열 표현뿐만 아니라 String과 유사한 개체가 필요할 때 호출 할 수 있습니다. (IRB에서 시도해보십시오 : [1,2,3].to_str실패 할 것 [1,2,3].to_s입니다. 그러나 그렇게되지는 않을 것입니다.) 나는 전에 그것에 물린 적이 있기 때문에 이것을 언급해야한다고 느낍니다. :)


Ruby Koans로 시작한 후 여기에 도착하는 모든 사람을 위해 출력 의 위치 to_sinspect차이점에 대한 간단한 예는 다음 같습니다.

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"

puts일반적으로 to_s개체 에 적용한 결과를 인쇄하고 개체 에 적용한 결과 p인쇄 inspect합니다.

inspect사이에는 미묘한 차이가 있습니다 to_s.

  • inspect, 객체에 적용하면 인스턴스 변수와 함께 객체 16 진 코드를 반환합니다.
  • to_s, 개체에 적용하면 개체 16 진수 코드 만 반환됩니다.

    클래스 항목
     def 초기화 (abc)
      @ abc = abc
     종료
    종료
    
    x = Item.new (22)
    
    puts x #prints object x hex code  
    x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc 
    puts x.to_s # 객체 x 16 진수 코드 인쇄
    
    px # INSTANCE VARIABLE @abc로 객체 x 16 진수 코드를 인쇄합니다.
    p x.inspect # INSTANCE VARIABLE @abc를 사용하여 개체 x 16 진수 코드를 인쇄합니다.
    p x.to_s # 객체 x 16 진수 코드 인쇄

2.0.0p195 :075 > puts (1..5).to_a                  # Put an array as a string.
1
2
3
4
5
=> nil 
2.0.0p195 :076 > puts (1..5).to_a.inspect          # Put a literal array.
[1, 2, 3, 4, 5]
=> nil 
2.0.0p195 :077 > puts :name, :name.inspect
name
:name
=> nil 
2.0.0p195 :078 > puts "It worked!", "It worked!".inspect    
It worked! 
"It worked!"
=> nil 
2.0.0p195 :079 > p :name                           # Same as 'puts :name.inspect'
:name
=> :name 

로부터 레일 자습서


Chris Pine의 Learn To Program 책의 답변

"inspect 메서드는 반환하는 문자열이 전달한 객체를 빌드하기위한 루비 코드를 표시한다는 점을 제외하면 to_s와 매우 유사합니다."

따라서 inspect 메서드는 다음과 같은 배열을 반환합니다.

[25, 16, 9, 4, 1, 0] 

puts / to_s가 반환되는 위치

25
16
9
4
1
0

Refer following link for more information and examples explaining difference between "to_s" and "inspect" as well as difference between "puts" and "p". https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects

참고URL : https://stackoverflow.com/questions/2625667/why-do-this-ruby-object-have-both-to-s-and-inspect-methods-that-appear-to-do-the

반응형