2012-06-08 3 views
0

제발, 공격하지 마세요. 여기에 대해 생각하게 만든 예제와 코드가 있습니다.변수가 본질적인 "포인터"입니까? params []는 포인터입니까? params []는 변수입니까?

레일에서 루비를 연구 중이며 MVC 및 params [] 연산자의 중간에 있습니다. 그리고

"So we don't just want to call tweet #1. Tweet.find(1) isn't enough." 
===> we need Tweet.find(params[:id]) 

params[:id] aka params = { :id => 1 } 

그래서 내가 해시로 시작, 내 자신에 다른 부분을 라벨했다 어쨌든, 레일에 전념 내 노트북의 내부 표지에 어떤 증거라도, 미리 알림을 내려 놓고있다. "1의 값은 다음과 같습니다 ID가 열쇠에서,"? PARAMS는 "

포인터를 PARAMS입니다 .... 포인터는 변수가

편집 : 다른 있습니까 매개 변수가 아닌 다른 값이없는 "변수"(더 나은 용어가없는 경우) :이 값은 "컨테이너"의 특수한 유형입니까 아니면 그냥 받아들이는 것이 정상입니까? EDIT2 : 모든 변수가 기술적으로 포인터입니까? 이 사실이라면 : 해시 내부의 키도 기술적으로 포인터인가? 하하이면 true params는 오른쪽을 가리키는 포인터를 가리키는 포인터입니다.

답변

3

여기에 맞는 용어를 사용한다고 생각하지 않습니다. 어쩌면이 도움이 될 것입니다

  • PARAMS 토큰은 어떤 객체에 대한 참조를 유지하는 변수 이름입니다.
  • 기술적으로 매개 변수은 Hash 개체에 대한 참조를 반환하는 메서드입니다.
  • 실제로는 params.is_a?(Hash) == true이므로 매개 변수를 해시로 처리합니다.
  • : id 토큰은 Symbol 객체입니다.
  • params[:id]에서 : id는 해시 값의 키입니다.

IMHO, 일반적으로 루비의 객체를 포인터로 생각하는 것은 유용하지 않습니다. 어떤 이유로 든 의도적으로 사용하지 않는 한 포인터로 사용하는 것이 일반적으로 바람직하지 않습니다. 하지만 그렇습니다. 런타임 환경에서 C 포인터를 Ruby 객체로 바꾸는 간접적 인 계층이 많이 있습니다.

+1

해쉬의 해쉬라고 말하는 것이 무슨 뜻인지 잘 모르겠지만 당신이 틀렸다고 생각합니다. 그것은 단지 해시 일 뿐이며, 값은 모든 종류의 객체, 문자열, 픽스 넘, 배열 또는 해시입니다. –

+0

일반적인 레일 앱의'params'는 항상'controller'와'action'과 같은 해시가 아닌 값을 포함합니다. 귀하의 진술은 오해의 소지가 있습니다. –

+0

'params'는 실제로'HashWithIndifferentAccess' ('Hash' 하위 클래스)에 대한 참조를 반환하는 메소드입니다. –

0

params는 HTTP를 통해 전달 된 변수의 해시입니다 요청

+0

oohh. 매개 변수는 어디에 있습니까? "경로"(URI)에? 아마. 그들은 다른 곳 어디에서나 갈 수 있었습니까? –

+0

다릅니다. widgets/1 params [: id]와 같은 get 요청은 URL에 전달 된 1이됩니다. 또는 이러한 종류의 요청에 대해 풋 또는 포스트를 통해 전송 될 수 있습니다. 추가 : id는 문자열과 같은 기호이지만 싱글 톤이므로 메모리에 하나의 주소 만 가지므로 루비/레일의 모든 곳에서 키로 사용됩니다. – DVG

+0

그러나 URL은 세미콜론을 허용하지 않습니다. .권리? –

0

params은 해시에 대한 참조를 반환하는 메서드입니다.

(그러나 일반적으로 그것은 "이 params 해시"가 아니라 "는 params[] 사업자"라합니다.)

해시 해시 키와 문자뿐만 아니라 다른 데이터 유형을 사용할 수 있습니다 :

[1] pry(main)> h = Hash.new 
=> {} 
[2] pry(main)> h[:foo] = 42 
=> 42 
[3] pry(main)> h[42] = :foo 
=> :foo 
[4] pry(main)> h 
=> {:foo=>42, 42=>:foo} 
[5] pry(main)> h[h[:foo]] 
=> :foo 

":keys 값없이 허용 하시겠습니까?"라는 것이 무슨 뜻인지 모르겠습니다.

기호는 다른 방법으로 사용할 수도 있습니다 (예 : 메서드 참조). before_filter를 정의 할 때 예제는 다음과 같습니다

class UsersController < ApplicationController 

    before_filter :init 

    def index 
    # etc 
    end 

    private 

    def init 
     # Does some stuff 
    end 
end 

before_filter 방법은 작업을 호출하기 전에 실행하는 방법을 나타내는 기호를합니다.

기호는 아니요, 참조이며, 기호이며, 자체적으로 평가됩니다. this SO question을 참조하십시오.

+0

'params'는 Hash (실제로 HashWithIndifferentAccess)에 대한 참조를 반환하는 * 메소드입니다. –

+0

@muistooshort 업데이트되었습니다! 도! –

관련 문제