我最近遇到了這個問題,我很好奇我是否錯誤地使用了命名引數,或者更好地理解它們為什么會這樣。
def test_param(b=false)
if b
puts 'param is true'
puts b
puts b.class
else
puts 'param is false'
puts b
puts b.class
end
end
當我在 REPL 中測驗此功能時,我看到
2.5.3 :213 > test_param(true)
param is true
true
TrueClass
=> nil
2.5.3 :214 > test_param(false)
param is false
false
FalseClass
=> nil
2.5.3 :215 > test_param(b:true)
param is true
{:b=>true}
Hash
=> nil
2.5.3 :216 > test_param(b:false)
param is true
{:b=>false}
Hash
=> nil
2.5.3 :217 >
當我使用命名引數時,如何將變數資料型別更改為哈希,這似乎是錯誤的。
uj5u.com熱心網友回復:
與其他語言(如 Python)不同,Ruby 將位置引數和關鍵字引數嚴格分開。呼叫方法時不能提供關鍵字引數作為位置引數,反之亦然。
在您的情況下,您在方法中定義了一個位置引數(即b)。在您的最后兩個示例中,您向它傳遞了一個 Hash。請注意,在呼叫方法并將哈希作為其最后一個引數傳遞時,通常用于定義哈希的花括號是可選的。在較舊的 Ruby 版本中,這被用作允許/傳遞可選引數串列的約定,其作業方式類似于關鍵字引數。
由于 Hash 物件始終為真(請記住,在 Ruby中 onlyfalse和nil為假),因此您始終使用if條件分支并輸出您在那里看到的資訊。
話雖如此,如果你想用你的方法接受關鍵字引數,你必須相應地定義它,例如:
def test_param(b: false)
# ...
end
請注意此處引數定義的差異。您可以從Ruby 語言檔案中了解有關 Ruby 中關鍵字引數的更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/376040.html
標籤:红宝石
