에서 attr_accessor의 방법에 접근 나는 코드가? 왜 인스턴스 변수를 작성자를 통해 할당 할 수 없습니까? 그러나 왜 지역 변수가 메소드 대신 생성되었다 (setter)?루비 :</p> <pre><code>class A attr_accessor :somevar def a somevar = 'something' puts @somevar end def b send :somevar=, 'something' puts @somevar end end A.new.a #=> nil A.new.b #=> 'something' </code></pre> <p>왜 차이가 : 내부 방법
답변
attr_accessor :somevar
변수 @somevar
을 참조하십시오. 인스턴스 변수 앞에는 @
부호가 와야합니다. 메서드에 @
기호가없는 'somevar'와 같은 다른 모든 변수는 해당 메서드 또는 범위에 대한 로컬 변수이며 객체의 인스턴스 변수가 아닙니다. 방법의 첫 번째 행을 변경 따라서
, "A"
에@somevar = 'something'
가 예상이 질문에 발생합니다.
관련 메모 : Ruby에서 인스턴스 변수를 선언 할 필요가없는 경우 @somevar
유형 표기법으로 인스턴스 변수를 만듭니다. attr_accessor
메서드는 해당 인스턴스 변수에 대한 setter 및 getter를 만듭니다.
Ruby의 메소드가 객체에 첨부되어 있으므로 클래스 A가 자체 somevar setter 메소드를 호출하려면 self.somevar = 'something'
을 작성해야합니다. 그렇지 않으면 Ruby 파서는 사용자가 로컬 변수를 작성한다고 생각합니다.
방금 수행하여, b
에서 방법 a
를 호출 할 수 있기 때문에 이것은 혼란 스러울 수 :
def b
send :somevar=,'something'
puts @somevar
a # would invoke its own method 'a'
end
을하지만 setter 메소드 somevar=
이 같은 표기법으로 로컬 변수를 만드는 모호 :
somevar='something' # Ruby assumes you want to create a local variable
somevar setter 메서드를 호출하려면 다음과 같이 자체 메서드를 호출한다고 명시해야합니다.
self.somevar = 'something'
send :somevar=,'something'
을 호출 할 때도 somevar 인스턴스 메소드를 호출하고있었습니다.
메서드 a는 somevar라는 로컬 변수를 만들기 때문에 발생합니다. 루비의 작은 단점 중 하나입니다. self.somevar = 'something'
또는 @somevar = 'something'
을 사용하여이 문제를 해결할 수 있습니다.
하지만 왜? 동일한 이름의 메소드가 종료되었지만 로컬 변수가 생성 되었습니까? – Kuraga
아마 안전상의 이유로. 'somevar'라는 setter 메소드를 가지고 있고 그것을 사용하기 시작했다는 것을 알지 못한다면, 당신이 그것을 알지 못하면이 값을 덮어 쓸 것입니다. –
- 1. document.getElementById (somevar) not working
- 2. self.class_eval << DEF ... DEF
- 3. sed <? xml [something?>
- 4. <% = something %>이란 무엇입니까?
- 5. 메서드가 재정의되었음을 감지 할 수 있습니까?</p> <pre><code>class Foo def hi end end class Bar < Foo def hi end end </code></pre> <p>그리고 내가 매개 변수로 <code>Bar</code>을 통과하고있어 일부 코드가 있다고 가정 : 여기에 가정
- 6. 루비 클래스 메소드는 <pre><code>class UsersController < ApplicationController def dashboard @totalclose = Post.find_latest_closed @totalopen = Post.find_latest_open end end </code></pre> <p>PostController</p>에서
- 7. 부모 모델 클래스에서 before_save 메서드를 호출하려면 어떻게해야합니까?</p> <pre><code>class Game before_save :update_teacher teacher end def update_teacher teacher.update_attribute("something", true) end end class Puzzle < Game belongs_to :teacher end </code></pre> <p>나는 게임의 많은 종류가 있습니다
- 8. "puts"출력이 Ruby에서 들여 쓰기되는 이유는 무엇입니까?</p> <pre><code>def getch begin system("stty raw -echo") ch = STDIN.getc puts "[#{ch}]" ch ensure system("stty -raw echo") end end print "Press a key: " getch puts "Have a nice day!" </code></pre> <p>다음과 같은 실행 : 다음 루비 프로그램을 감안할 때
- 9. 루비 -e는이 내가 기대했던 것입니다 데비안 기계</p> <pre><code>$ ruby -e 'puts "something"' something $ </code></pre> <p>에 무슨 일 맥 OS X
- 10. 루비 객체에 블록이나 프로 시저에 전달하는 메소드가 있습니까? 만일이 같은 방법이 존재</p> <pre><code>class Object def yield_self yield(self) end end </code></pre> <p>않습니다
- 11. StandartError를 사용하는 방법? 나는 다음과 같은 오류 얻을</p> <pre><code>#!/usr/bin/env ruby class WrongNumberOfPlayersError < StandartError ; end class NoSuchStrategyError < StandartError ; end </code></pre> <p>:
- 12. C# : 하위 클래스 목록 <Something>?
- 13. 맞춤 << 방법
- 14. Ruby에서 한 줄에 메서드를 정의하는 더 좋은 방법 (더 나은 스타일)은 무엇입니까?</p> <pre><code>def method; some code end </code></pre> <p>또는</p> <pre><code>def method() some code end </code></pre> <p>이유 :
- 15. 인쇄물과 같은 것 END << END; C++에서?
- 16. 리스트 <something> 및 GridView 편집
- 17. 어떻게 내가 내가 그것을 어떻게해야합니까이</p> <pre><code>a = 'Something': False </code></pre> <p>되고 싶어이</p> <pre><code>a = "'Something': False" </code></pre> <p>이 아닌 문자열
- 18. Expr <'a -> 'b>을 (를) Expression <Func <'a, obj>>
- 19. class_eval과 class << className의 차이점은 무엇입니까?
- 20. 바보 같은 질문에 대한 <li><a></a></li>
- 21. 레일 :</p> <pre><code>def get_articles @articles = [] Doc.column_names.each do |a| if a.match(/^article/) @articles << a end end end </code></pre> <p>을하지만 원치 않는 결과를 많이 반환 : 문자열로 시작하고 내가 여기이 작은 일을 가지고 다른
- 22. 이 이상한 조건부 연산자 구문은 무엇입니까?</p> <pre><code>bool bRes = (a < b) ? a=b, true : false; </code></pre> <p><code>a < b</code> 경우, <code>a=b</code> 실행 및 <code>bRes</code> 사실이다 :
- 23. <a> 링크</a>에서 <a> 및</a>를 제거하는 방법
- 24. Vim에 <Ctrl> + <Shift> + <End>의 등가는 무엇입니까?
- 25. 문자열에서 PHP 추출 값이 <star>t와 <end>
- 26. 왜 레일은 기본적으로 내가 그런</p> <pre><code>def index @lists = List.all end </code></pre> <p>않는 인덱스와 list_controller라는 간단한 컨트롤러가 각
- 27. 어떻게 단어 <ul><li><div><a></a></div></li></ul>
- 28. PHP는 오류 <<< _ END 사용하여 XAMPP
- 29. Rails의 ActiveRecord는 경쟁 조건을 노출합니까? <code>c.value</code> 만 1 씩 증가하는 것이 가능하고, 두 개의 클라이언트가 동시에 <code>inc</code> 방법 액세스하면</p> <pre><code>class CountersController def inc c = Counter.find(1) c.value += 1 c.save! end end </code></pre> <p>:
- 30. Mongo에서 배열 내부의지도에서 필드를 설정 해제하려면 어떻게해야합니까?</p> <pre><code>{:a [{:b "something", :c "else"}, {:b "more" :c "fun"}]} </code></pre> <p>내가 설정 해제하려면 : 내 문서의
그러나 메소드 (setter) 대신 로컬 변수가 작성된 이유는 무엇입니까? – Kuraga
Ruby의 메소드가 객체에 첨부되어 있기 때문에 클래스 A가 자신의 somevar setter 메소드를 호출하려면'self.somevar = 'something''을 써야합니다. 그렇지 않으면 Ruby 파서는 당신이 단지 로컬 변수를 작성한다고 생각합니다. 위의 답변을 더 자세히 설명하기 위해 업데이트했습니다. – quux00
Ok thanx :)))))))))) – Kuraga