我有很多的命名參數,一些使用默認值的方法:方式重構命名參數使用默認值
def myClass
def initialize(a:, b:, c:, d:, e:, f:, g: nil, h: nil, i: nil)
...
end
end
名單是有點硬來看待和理解。我正在尋找更簡單的方法。
使用了ARGS哈希,
myClass.new(**args)
的作品,但我不能有和沒有價值的兩個符號。
有沒有辦法讓這個更簡單?
我有很多的命名參數,一些使用默認值的方法:方式重構命名參數使用默認值
def myClass
def initialize(a:, b:, c:, d:, e:, f:, g: nil, h: nil, i: nil)
...
end
end
名單是有點硬來看待和理解。我正在尋找更簡單的方法。
使用了ARGS哈希,
myClass.new(**args)
的作品,但我不能有和沒有價值的兩個符號。
有沒有辦法讓這個更簡單?
你可以試試這個
def myClass
def initialize(args)
[:a, :b, :c, :d, :e, :f].each do |a|
raise ArgumentError.new unless args.has_key?(a)
end
...
end
end
args
是一個哈希對象。
可能有些情況下函數需要大量的參數,但通常這表明函數在一個地方做了太多事情。
好吧,如果你想這樣做,我想將其移動到一個特殊的私有方法:
class MyClass
def initialize(*args)
args = set_defaults(args)
end
private
def set_defaults(args)
# step 1: extract the options hash and check the keys,
# if a key doesn't exist so put it in with the default value
options = args.extract_options!
[g: :state, h: 'a name', i: 5].each do |key, value|
options[key] = value unless options.key?(key)
end
# step 2: check the other array elements
[:a, :b, :c, :d, :e, :f].each do |element|
raise ArgumentError.new unless args.include?(element)
end
# step 3: put them all together again
args << options
end
end
BTW:不起作用。這是class ClassName
。另外請看看美麗的ruby style guide - naming。
'options [key]'如果'key'不存在則總是返回'nil',因此明確地將其設置爲'nil'是不必要的。 – engineersmnky
沒錯。其意圖是展示一種設置默認參數的方法。我將編輯代碼並設置一些不同的參數。 – guitarman
命名參數可以提高質量。爲什麼要刪除它們如果很難查看,只需在參數列表中使用換行符。還要看看是否有些參數屬於一起,應該收集在一個結構或對象中。 – Meier