gpt4 book ai didi

带有关键字参数的 ruby​​ 初始化

转载 作者:行者123 更新时间:2023-12-02 17:27:21 28 4
gpt4 key购买 nike

我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。

class Gear
attr_reader :chainring, :cog, :wheel
def initialize(args)
@chainring = args.fetch(:chainring, 40)
@cog = args.fetch(:cog, 10)
@wheel = args[:wheel]
end

def gear_inches
ratio * diameter
end

def diameter
wheel * diameter
end
end

Gear.new(chainring: 52, cog: 11, wheel: Wheel.new(26,1.5)).gear_inches

如果使用新的关键字参数,这会是什么样子?这是我在下面的猜测,但不确定它是否与上面的轮子结果相同。

class Gear
attr_reader :chainring, :cog, :wheel
def initialize(chainring: 40, cog: 10, wheel:) #is this good here for wheel?
@chainring = chainring
@cog = cog
@wheel = wheel #is this good here for wheel?
end

......
end

最佳答案

文字等价物是这样的:

class Gear
def initialize(**args)
@chainring = args.fetch(:chainring, 40)
@cog = args.fetch(:cog, 10)
@wheel = args[:wheel]
end
end

原始代码允许传递任意键并忽略不需要的键,因此,我们使用 **ksplat 来允许任意参数。

我们可以将该代码重构为:

class Gear
def initialize(chainring: 40, cog: 10, **args)
@chainring = chainring
@cog = cog
@wheel = args[:wheel]
end
end

这样读起来稍微好一点。但这仍然是糟糕的设计:为什么允许用户传递任意键?当传递未使用的 key 时,这很可能是一个错误。例如。用户调用 Gear.new(cgo: 20),这显然是一个拼写错误,但他并没有得到错误,而是默默地得到了错误的数据(一个 cog 的值10).

class Gear
def initialize(chainring: 40, cog: 10, wheel: nil)
@chainring = chainring
@cog = cog
@wheel = wheel
end
end

我猜这相当于原始代码的预期行为。它的行为不同,因为它不允许传递任意键,但我认为这无论如何都没有意义。因此,虽然不等同,但可以说更好

但是还有一个问题(原代码中也存在):有可能不传wheel,使得wheel最终为nil 。但是,wheel 是无条件使用的(例如在 diameter 中),这意味着,当 wheelnil< 时,它将在运行时爆炸。因此,最好要求传递 wheel:

class Gear
def initialize(chainring: 40, cog: 10, wheel:)
@chainring = chainring
@cog = cog
@wheel = wheel
end
end

当然,这正是您所拥有的。这在行为上是等价的,但我认为它在意图等价的,而且可以说是更好、更正确。

关于带有关键字参数的 ruby​​ 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37566224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com