← Writing

Ruby: String vs Symbol

字串與符號的差異? 字串(String): 字串是一種數據類型,用於表示文本數據,例如字母、數字、符號和空格。 字串是由一系列字符組成,這些字符可以包括字母、數字、標點符號等。 字串通常用引號(單引號或雙引號)括起來,例如:"Hello, World!"。 字串可以包含多個字符,並且可以進行各種操作...

interviewruby

字串與符號的差異?

字串(String):

  • 字串是一種數據類型,用於表示文本數據,例如字母、數字、符號和空格。
  • 字串是由一系列字符組成,這些字符可以包括字母、數字、標點符號等。
  • 字串通常用引號(單引號或雙引號)括起來,例如:"Hello, World!"。
  • 字串可以包含多個字符,並且可以進行各種操作,如連接、分割、查找、替換等。

Ruby string methods

  • 連接(Concatenation):
    • 使用 + 運算符或 << 運算符將兩個字符串連接在一起。
str1 = "Hello"
str2 = "World"
result = str1 + " " + str2
# 或者
result = str1 << " " << str2
puts result # 輸出:Hello World
  • 分割(Split):
    • 使用 split 方法來將字串根據指定的分隔符,分割成一個字串 Array。
text = "Apple, Banana, Cherry"
items = text.split(", ")
puts items # 輸出:["Apple", "Banana", "Cherry"]
  • 查找:

    • 使用 include? 方法來檢查字串是否包含特定的字。
    text = "Hello, World!"
    if text.include?("World")
      puts "包含 'World'"
    end
    
    • 使用 index 方法來查找位置。
    text = "Hello, World!"
    position = text.index("World")
    puts "位置:#{position}" # 輸出:位置:7
    
  • 替換(Replace):

    • 使用 subgsub 方法來替換字串中的指定字串。
    text = "Hello, World!"
    new_text = text.sub("World", "Ruby")
    puts new_text # 輸出:Hello, Ruby!
    
    • sub 只替換第一個匹配的字串,而 gsub 會替換所有匹配的字串。
    text = "Hello, World! World is great."
    new_text = text.gsub("World", "Ruby")
    puts new_text # 輸出:Hello, Ruby! Ruby is great.
    

符號(Symbol):

  • 符號是一種特殊的數據類型,通常用於代表獨一無二的標識符號或常數。
  • 符號通常不用引號括起來,而是直接以符號的名稱表示,例如::symbol_name

Brief Summary

String 字串,主要用於表示 Text Data Type,是可變動的,可以在運行時更改。 而 Symbol 符號主要用於表示靜態或唯一的標識符,通常用於代表程式碼中的實體或概念,並且在整個程序運行期間保持不變。符號的主要優勢之一是它們的唯一性,可以減少內存使用,因為僅能創建一次並重複使用。

  • 可以透過 object_id 來觀察兩者差異:
str1 = "Hello"
str2 = "Hello"
sym1 = :hello
sym2 = :hello

puts "String 1 object_id: #{str1.object_id}"
puts "String 2 object_id: #{str2.object_id}"
puts "Symbol 1 object_id: #{sym1.object_id}"
puts "Symbol 2 object_id: #{sym2.object_id}"

# String 1 object_id: 60
# String 2 object_id: 80
# Symbol 1 object_id: 1194588
# Symbol 2 object_id: 1194588

可以發現 string 在每新增一次都會產生一個新的記憶位置, 而在建立同一個 symbol 時,所指向的記憶體位置都相同。