簡體   English   中英

Ruby 中 [方括號] 的所有不同用途是什么?

[英]What are all the different uses of the [square brackets] in Ruby?

我在 Ruby 中經常遇到方括號[]語法,但它似乎從來沒有做同樣的事情。 任何人可以列出 Ruby 中方括號[]所有不同用途,以便我的頭腦可以處理這個看似無窮無盡的小符號嗎? (一個符號怎么可能做這么多事情而不會讓 Ruby 解釋器感到困惑?)

例子:

  • [][]=方法
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]

方括號分為兩個嚴格的上下文和一個可選的上下文:

定義數組
可以使用類似[1,2,3]的語法在代碼中指定數組,即提供元素和有序元素列表的數據結構。 這產生與所述三個元素的數組12 ,和3中完全相同的順序。 然后,您可以使用迭代器函數(如eachmap迭代數組,或者您可以通過其索引ID直接訪問特定元素,如下所示。

訪問數組和散列中的元素
哈希(在其他語言中也稱為哈希映射,字典或關聯數組)也包含與數組類似的元素。 與它們存儲數據無序的方式不同。 數據不是由整數id訪問的,就像數組一樣,但是具有任意鍵(通常是符號或字符串)。 這與例如PHP不同,其中兩者使用相同的Array類型。

對於哈希和數組,通過調用[][]=的方法可以方便地訪問數據。

my_array = [:a, :b, :c]
second_element = my_array[1]
# => :b
# notice that the first element in arrays always has the index 0

my_hash = {:a => 1, :b => 2, :c => 3}
element_of_b = my_hash[:b]
# => 2

這是括號的常見用例。 在Ruby代碼中,您有時可能會看到其他類實現括號函數。 他們這樣做是為了允許類似於數組或哈希的訪問,然后通常期望這些類的行為與那些類似,但這絕不是強制執行的。 另見鴨子打字

%表示法
Ruby有第三種語法來創建除常見之外的字符串(和其他對象)。 使用這種語法,代碼中的文字字符串不包含在"'而是使用特殊的分隔符。它以百分號開頭,單個字符指定要創建的對象,幾乎任何字符都選擇作為分隔符:

a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]

這三個示例都創建了相同的數組。 請參閱一些有關如何使用此語法的文檔以及Ruby中可用的其他修飾符。

雖然這里通常使用括號,但它絕不是必需的,如果需要可以替換。 這里只是建議,因為這種表示法的最常見用法是從空格分隔的字符串創建一個元素數組(如上所示)。 因此,括號的使用使得進一步清楚返回數組,因為語法看起來類似於基本數組規范。

好吧,只是為了我自己的筆記,我已經走了,仔細看看這個,並在Holger Just的答案的基礎上 ,提出以下內容:在Ruby中使用方括號可以分為6個用途,其中3個是一部分Ruby的方法定義和其中3個語義結構。

方法定義

通過類方法創建對象Array :: [],Hash :: []

Array.[](1,2,3) #=> [1,2,3]                        #Un-sugared notation
Array["a","b","c"] #=> ["a","b","c"]               #Sugared equivalent
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}  

與文字構造函數無關,盡管它做同樣的事情。

元素引用通過實例方法Array#[],Bignum#[],Continuation#[],Fixnum#[],Hash#[],MatchData#[],Method#[],Proc#[],String#[], Struct#[],Symbol#[],Thread#[]和類方法Dir :: [],ENV :: []

ary = [1,2,"abc", [15,16,[26,27]]]  
ary.[](2) #=> "abc"                #Un-sugared notation
ary[2] #=> "abc"                   #Sugared equivalent
ary[0,2] #=> [1,2]  
ary[3][2][1] #=> 26  
[1,2,3][0] #=> 1  
"Is a string"[7,3] #=> "rin"  

通過實例方法進行元素賦值Array#[] =,Hash#[] =,String#[] =,Struct#[] =,Thread#[] =,類方法ENV :: [] =

ary = [1,2,3]  
ary.[]=(1,"abc") #=> [1,"abc",3]    #un-sugared notation
ary[2] = "def" #=> [1,"abc","def"]  #Sugared equivalent
hash = {"a"=>1, "b"=>2}  
hash["a"] = 3 #=> {"a"=>3, "b"=>2}  

語義結構

通過數組文字構造函數創建對象

ary = []  

Ruby中有一堆文字構造函數通過使用(通常)一個簡單的符號對來創建相關類的對象,方括號是數組對象的文字構造函數:Array [] ,Hash {} ,Proc ->(){} ,Range ..... ,Regexp // ,String ""'' ,符號::""

通過%表示法創建對象

%q[hello there you] #=> "hello there you"           # String % notation  
%w[hello there you] #=> ["hello", "there", "you"]   # Array % notation  

嚴格來說,它不是方括號表示法,而是兩符號對符號,如果您願意,可以使用方括號。 所以%q@hello there you@同樣有效。

Ruby的正則表達式

/[^A-Fa-f0-9]/  

方括號表示Ruby正則表達式中的字符類。

我確實發現[]另一個用途,作為在Dir :: glob方法中使用的模式,但它應該完全像在正則表達式中那樣。 不過,它表明Ruby的1500多種方法中可能存在更多用途。

使用方括號實例化結構的方便語法

irb(main):001:0> Point = Struct.new(:x, :y)                         
=> Point                      
irb(main):002:0> point = Point[1,2]                                 
=> #<struct Point x=1, y=2>   
irb(main):003:0> point.x                   
=> 1                           
irb(main):004:0> point.y                    
=> 2     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM