def visualization (name, age, looks)
age.to_s
puts name ' is ' age ' years old and looks ' looks
end
visualization (name = 'Mary', age = 5, looks = 'bad')
#=> `visualization': wrong number of arguments (given 1, expected 3) (ArgumentError)
uj5u.com熱心網友回復:
所以這里的主要問題是visualization它的引數之間的空間。當 ruby?? 看到visualization (name = 'Mary', age = 5, looks = 'bad')它時,它會將 `visualization 識別為一種方法(因為它有引數),但它首先嘗試計算括號中的運算式:
(name = 'Mary', age = 5, looks = 'bad')
這本身就是一個有效的 ruby?? 運算式,但看看 ruby?? 如何解釋它可能會令人驚訝:
name = ('Mary', (age = 5), (looks = 'bad'))
導致name存在['Mary', 5, 'bad']、age存在5和looks“壞”。
由于運算式只是一個賦值,它回傳分配的值(陣列['Mary', 5, 'bad']),然后將其傳遞給您的visualisation方法。由于您傳遞的是單個陣列并且您的方法需要三個引數,因此您會收到錯誤訊息。
根據解決方案,只需洗掉方法呼叫及其引數之間的空格。你也不需要命名引數——這不是 Python——這里的關鍵字是明確定義的,你實際上是通過這樣做來創建區域變數的。
還有一些其他問題,但@Stefan 已經涵蓋了。
uj5u.com熱心網友回復:
age.to_s不會改變age物件(你不能在 Ruby 中改變物件的類),它只是回傳一個新的字串。因此,您必須通過重新分配年齡age = age.to_s或將to_s呼叫轉移到需要的地方:
def visualization(name, age, looks)
puts name ' is ' age.to_s ' years old and looks ' looks
end
您可以改用字串插值,這更慣用并且使to_s呼叫變得多余:
def visualization(name, age, looks)
puts "#{name} is #{age} years old and looks #{looks}"
end
呼叫此方法時,您通過以下方式傳遞引數:
visualization('Mary', 5, 'cute')
# ^ and no space here
代碼中的賦值沒有多大意義。您可能想要關鍵字引數:(注意冒號)
def visualization(name:, age:, looks:)
puts "#{name} is #{age} years old and looks #{looks}"
end
visualization(name: 'Mary', age: 5, looks: 'cute')
uj5u.com熱心網友回復:
TL; 博士
Ruby 不像 Python 之類的語言那樣對空格敏感,但在某些地方,空格會使決議器感到困惑。此外,雖然您的某些代碼可以作業,但它并不符合習慣(它讀起來像 JavaScript)并且性能較低。最后,就地運算子通常是 bang 方法,因此您需要區分更改接收器的方法和回傳新結果的方法。
慣用替代
出于文化原因,我更改了您的一些代碼,但在資料方面保持接近您的意圖。其余部分旨在展示如何更慣用地做你想做的事。
這是使用字串插值的更慣用和決議器友好的替代方案:
def user_data(name, age, status)
pp "name is #{name}; age is #{age}; status is #{status}"
end
#{expr}在雙引號內使用嵌入運算式運算子的字串插值通常更有效,并且如果它支持 #to_s 或 #to_str 方法,則隱式將值轉換為字串。的內核,#P和內核#PP方法確保了該方法回傳的值,以及列印到$標準輸出。
或者,您也可以使用其他構造,例如 here-documents、String#sprintf、String#format和許多其他構造來構造 printf 樣式的插值,但是對于大多數 Ruby 愛好者來說,上面的示例最容易閱讀,并且通常應該是您的首選——如果您遵循大多數流行的 Ruby 風格指南,包括RuboCop 的默認風格指南。
注意:插值適用于凍結的字串文字
最后要注意的是,即使您在檔案頂部啟用了凍結字串文字“魔術注釋”,這種型別的插值也將起作用,例如:
#!/usr/bin/env ruby
# frozen_string_literal: true
這通常被RuboCop和其他類似工具視為最佳實踐。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/353884.html
