gpt4 book ai didi

java - 将 Java 移植到 Ruby - 如何处理方法签名重载

转载 作者:行者123 更新时间:2023-12-02 05:06:42 26 4
gpt4 key购买 nike

我正在将一些 java 代码移植到 ruby​​,并正在寻求有关如何最好地实现下面的方法签名重载的指导?

使用 Ruby 的可选参数,我可以容纳所有重载,但这将导致不太理想的“条件”编码来确定我正在处理哪些参数。有什么更“类似 Ruby”的方法来处理这个问题?

  # public void set (ISOComponent c)
# public void set(int fldno, String value)
# public void set (String fpath, String value)
# public void set (String fpath, ISOComponent c)
# public void set (String fpath, byte[] value)
# public void set (int fldno, byte[] value)
def set(iso_component: nil, field_number: -1, string_value: '', file_path: '', byte_array: nil)

最佳答案

对于 Ruby,我认为最好的选择是依赖不同的 OOP 设计原则,例如鸭子类型。如果您创建共享一致接口(interface)的对象,那么您的代码可能会变得更干净、更易于维护,而不是尝试创建一个根据您传递给它的参数来执行 6 种不同操作的 set 方法。作为参数传递给您的 set 方法。这是一个例子:

class MyObject
def set(obj)
# depend on the interface: duck typing
obj.set_the_things
end
end

class ISOComponent
def set_the_things
# do ISOComponent specific stuff here
end
end

class OtherInput
attr_accessor :field_number, :value

def set_the_things
# do OtherInput specific stuff here
# using @field_number and @value
end
end

my_obj = MyObject.new
iso_component = ISOComponent.new
other_input = OtherInput.new

my_obj.set(iso_component)
my_obj.set(other_input)

由于 MyObject#set 仅依赖于可传入其中的对象中的 set_the_things 方法,因此您可以将任意数量的不同对象传递给此方法,以便只要他们实现自己的 set_the_things 方法来执行特定于其目的的操作。因此,如果您需要一个处理文件路径和 ISO 组件的输入,您可以构建一个具有 set_the_things 方法的对象,该方法可以对文件路径和 ISO 组件执行所需的操作,而不是尝试创建您的 set 方法对每个人来说都是一切(这对于测试和需要了解 set 方法的作用的客户来说可能更令人困惑)。

文章“Duck Typing”对此进行了描述。

关于java - 将 Java 移植到 Ruby - 如何处理方法签名重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27746336/

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