Ruby on Rails의 @ 변수


답변:


426

title지역 변수입니다. 범위 내에서만 존재합니다 (현재 블록)

@title 인스턴스 변수이며 클래스 내의 모든 메소드에서 사용할 수 있습니다.

자세한 내용은 여기를 참조하십시오 : http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Ruby on Rails에서 컨트롤러의 변수를 인스턴스 변수 ( @title) 로 선언 하면 뷰에서 사용할 수 있습니다.


4
답변 주셔서 감사합니다, 후속 질문이 있습니다 ... 작업중 인 클래스 내에서 멤버 변수는 처음에 @options = {...}과 같이 구성됩니다. 그러나 클래스 내의 메소드는 마치 로컬 인 것처럼 해당 변수를 사용하여 함수를 호출하고 함수를 호출합니다 (예 : "options.merge ()"). 이것은 단지 나쁜 형태입니까? 다른 구문 마법이 들어 갑니까? (즉, 변수의 조용한 dup을 만들거나 수정 할 수 없도록 'const'로 만드는 것)? 나는 C / C ++ & Java 관점에서 왔고, 실제로 모호하고 선택적인 구문은 나를 혼란스럽게한다!
Dan Devine 2018 년

클래스에 @DanDevine과 같은 이름으로 정의 된 attr_accessor가 있습니까? attr_accessor는 getter \ setter를 생성하는 구문 설탕입니다. @ 기호가없는 값을 얻는 경우 코드는 getter를 호출하기 때문에 변수를받습니다. 이것은 다른 방식으로는 작동하지 않으므로 var를 설정하거나 로컬 var를 설정하는 경우 @ 기호를 명시 적으로 사용해야합니다. 이것이 좋은 스타일입니까? 말하기 어렵다. 게터가 재정의되는 경우 내 메서드에서 게터 구문을 사용하는 것이 좋습니다. 클래스 자체 내에서도 캡슐화를 존중하고 싶습니다. YMMV
Msencenb 2009

30

@title뷰에서 변수를 사용할 수있게하려면 컨트롤러에서 사용하십시오 .

설명은 @title인스턴스 변수이고 title로컬 변수이며 레일은 제어기의 인스턴스 변수를보기에 사용할 수있게합니다. 템플릿 코드 (erb, haml 등)가 현재 컨트롤러 인스턴스의 범위 내에서 실행되기 때문입니다.


감사합니다! 이것은 컨트롤러 클래스에 정의 된 @variables가 뷰의 코드로 선택 될 수있는 이유를 설명하는 유일한 대답입니다.
AlexC

25

차이점은 변수의 범위에 있습니다. @version은 클래스 인스턴스의 모든 메소드에서 사용할 수 있습니다.

짧은 대답은 컨트롤러에 있고 변수를 뷰에 제공 해야하는 경우을 사용하십시오 @variable.

훨씬 더 긴 대답을 보려면 다음을 시도하십시오 : http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html


14

@variable루비에서는 인스턴스 변수라고합니다. 클래스 내부의 모든 방법으로 이러한 변수에 액세스 할 수 있습니다. [클래스의 모든 메소드에서]

@기호가 없는 변수 는 로컬 변수라고하며, 이는 선언 된 방법에서만 이러한 로컬 변수에 액세스 할 수 있음을 의미합니다. 로컬 범위로 제한됩니다.

인스턴스 변수의 예 :

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

위 예제 @cust_id에서 @cust_name, @cust_addr클래스 내 다른 방법으로 액세스합니다. 그러나 로컬 변수를 사용하여 동일한 내용에 액세스 할 수 없습니다.


9

에 대한 튜토리얼 어떤 변수 범위입니까? 여기에 관련 내용을 담아 세부 사항을 잘 제시하십시오.


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

로컬 변수는 초기화 블록 내에서만 액세스 할 수 있습니다. 또한 지역 변수는 소문자 (az) 또는 밑줄 (_)로 시작합니다.

그리고 인스턴스 변수는 인스턴스 self이며 시작으로 시작합니다. @또한 인스턴스 변수는 객체 자체에 속합니다. 인스턴스 변수는 예를 들어 메소드를 수행하는 변수입니다..send 등에서

예:

@user = User.all

@user인스턴스 변수

초기화되지 않은 인스턴스 변수의 값은 Nil


어떻게 이것이 @title& 의 차이점을 설명 title합니까?
Richard Peck

@title과 같은 인스턴스 변수를 사용하면 다양한 방법을 수행 할 수 있지만 로컬 변수는 그렇지 않습니다.
Joe Hilton

1
그러면 어떻게 실제로 문제가 해결됩니까? 튜토리얼을 인용 한 것 같습니다. 영업 이익은 그가 사용할지 여부를 알고 싶어 @titletitle
리처드 펙

따라서 def new 또는 def create 등의 메소드를 수행하려면 인스턴스 변수를 사용해야합니다.
Joe Hilton

3
아무것도 당신이 user = User.all을 수행하는 것을 멈추지 않고 사용자에 대해 메소드를 수행하지만 이것이 요점이 아닙니다.
Jaro

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.