2013-08-22 58 views
0

請看下面的代碼:Ruby:如何通過var保存字符串來獲取符號?

1 str1 = gets 
2 str2 = "Hello" 
3 puts str1 
4 puts str1.to_sym().object_id() 
5 puts str2.to_sym().object_id() 
6 puts :"Hello".object_id() 

在從標準輸入1號線,我輸入「你好」,並保存該字符串變種STR1。在第2行中,我將一個字符串「Hello」保存到var str2。現在str1和str2包含相同的字符串,儘管它們是不同的字符串對象,並且它們的值相同。根據符號的規則,我除了可以從str1和str2中獲得「Hello」的遊戲符號之外。但輸出是:

Hello 
213748 
213548 
213548 

看起來str1與str2有不同的符號。我怎樣才能從str1中獲得「Hello」的符號?

我問這個問題,因爲我面臨一個問題,我需要輸入stdin的一些單詞,然後使用這些單詞作爲鍵來構建一個哈希表。由於散列表應該使用符號作爲關鍵字來避免內存浪費,所以我需要獲得輸入字符的符號。

+1

不要使用'to_sym()'和'OBJECT_ID()',只要使用'to_sym'和'object_id'。這對於編寫Ruby來說非常關鍵,因爲別人會喜歡閱讀。 – meagar

回答

6

現在str1和str2中包含相同的字符串,雖然他們是不同的字符串對象,它們的值是相同的

你的假設是不正確的。

符號不同,因爲字符串不同。從gets開始的字符串以換行符結尾。您可以通過檢查:"Hello\n".object_id的值來證明這一點。

使用strip刪除尾隨換行,兩個字符串將是相同的,都將to_sym相同的符號:

puts str1.strip.to_sym.object_id 
+1

Thx,你是對的。然後是另一個問題。既然str1已經包含「\ n」,爲什麼第3行「puts str1」不打印空行?劑量會吃「\ n」? – TieDad

+0

否;它確實把一個空的換行符。我認爲你錯誤地解釋了輸出。試試'puts「|#{str1} |」' – meagar

+2

@EvanLi'puts'會在輸出中添加一個換行符_unless已經有一個換行符作爲最後一個字符了。因此'puts'foo「'和'puts」foo \ n「'具有相同的結果。從[文檔](http://ruby-doc.org/core-2.0/IO.html#method-i-puts):_「在沒有結束的地方寫入記錄分隔符(通常是換行符)換行符「。_ – Phrogz

3

@meagar是關於換行字符正確的,但是你也可以使用chomp

爲了證明這裏是一個示例會話從IRB:

2.0.0p247 :001 > without_chomp = gets 
Hello 
=> "Hello\n" 
2.0.0p247 :002 > with_chomp = gets.chomp 
Hello 
=> "Hello" 
2.0.0p247 :003 > with_chomp_and_to_sym = gets.chomp.to_sym 
Hello 
=> :Hello