Ruby의 다른 괄호는 무엇을 의미합니까?


85

루비에서의 차이 무엇 {}[]?

{} 코드 블록과 해시 모두에 사용되는 것 같습니다.

있습니다 []만 배열에 대해?

문서가 명확하지 않습니다.

답변:


70

상황에 따라 다릅니다.

  1. 자체적으로 또는 변수에 할당 할 때 []배열을 {}만들고 해시를 만듭니다. 예 :

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []사용자 정의 메소드로 재정의 할 수 있으며 일반적으로 해시에서 항목을 가져 오는 데 사용됩니다 (표준 라이브러리 []는와 동일한 해시에 대한 메소드로 설정 됨 fetch) 동일한
    클래스 메소드로 사용되는 규칙도 있습니다. static CreateC # 또는 Java에서 메소드를 사용할 수 있습니다 . 예 :

    a = {1 => 2} # create a hash for example
    puts a[1] # same as a.fetch(1), will print 2
    
    Hash[1,2,3,4] # this is a custom class method which creates a new hash
    

    마지막 예제 는 Ruby Hash 문서 를 참조하십시오 .

  3. 이것은 아마도 가장 까다로운 것 일 것입니다- {}또한 블록에 대한 구문이지만 인수 괄호 밖의 메서드에 전달 될 때만 가능합니다.

    괄호없이 메서드를 호출하면 Ruby는 쉼표를 넣은 위치를 확인하여 인수가 끝나는 위치 (입력 한 괄호가 있었던 위치)를 파악합니다.

    1.upto(2) { puts 'hello' } # it's a block
    1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
    1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
    

2
참고 : Hash # fetch는 정확히 Hash # []이 아닙니다. {: a => 1, : b => 2} .fetch (: c) IndexError : 키를 찾을 수 없음
tokland

@tokland :c를 찾을 수 없습니다
yyny

"또한 C # 또는 Java에서 정적 Create 메소드를 사용하는 것과 동일한 방식으로 클래스 메소드로 사용된다는 규칙이 있습니다." 이것이 제가 찾던 바로 그 대답입니다. 또한 내가 Ruby에 대해 가장 싫어하는 부분의 전형적인 예입니다. 루비 코드를 읽으려면 수많은 애매한 트릭을 알아야합니다.
Tony

21

그다지 분명하지 않은 또 다른 사용법은 []Proc # call 및 Method # call의 동의어입니다. 처음 만나면 약간 혼란 스러울 수 있습니다. 그 뒤에있는 합리적인 이유는 그것이 정상적인 함수 호출처럼 보이게 만드는 것입니다.

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

9

대체로 말하면 맞습니다. 해시뿐만 아니라 일반적인 스타일은 여러 줄에 / 를 {}사용하는 대신 한 줄에 모두 들어갈 수있는 블록에 대해 중괄호 가 자주 사용된다는 것입니다 .doend

대괄호 []는 String, BigNum, Dir 및 혼란스럽게도 Hash를 포함한 많은 Ruby 클래스에서 클래스 메서드로 사용됩니다. 그래서:

Hash["key" => "value"]

다음과 같이 유효합니다.

{ "key" => "value" }

3

대괄호 []는 배열을 초기화하는 데 사용됩니다. 이니셜 라이저 케이스 []에 대한 문서는

ri Array::[]

중괄호 {}는 해시를 초기화하는 데 사용됩니다. {}의 이니셜 라이저 케이스에 대한 문서는

ri Hash::[]

대괄호는 또한 일반적으로 Array, Hash, String 등과 같은 많은 핵심 루비 클래스에서 메서드로 사용됩니다.

"[]"메소드가 다음과 같이 정의 된 모든 클래스 목록에 액세스 할 수 있습니다.

ri []

대부분의 메서드에는 다음과 같이 할당 할 수있는 "[] ="메서드도 있습니다.

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

블록에서 "do ... end"대신 "{...}"와 같이 중괄호를 사용할 수도 있습니다.

사용 된 대괄호 또는 중괄호를 볼 수있는 또 다른 경우는 다음과 같이 기호를 사용할 수있는 특수 이니셜 라이저입니다.

%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"

2

몇 가지 예 :

[1, 2, 3].class
# => Array

[1, 2, 3][1]
# => 2

{ 1 => 2, 3 => 4 }.class
# => Hash

{ 1 => 2, 3 => 4 }[3]
# => 4

{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash

lambda { 1 + 2 }.class
# => Proc

lambda { 1 + 2 }.call
# => 3

2

[]자신의 클래스에 대한 메서드를 정의 할 수 있습니다.

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end

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