...) ,则此方法从文件-6ren">
gpt4 book ai didi

ruby 如何有两个可选参数但至少需要一个?

转载 作者:数据小太阳 更新时间:2023-10-29 08:40:59 24 4
gpt4 key购买 nike

我有这个方法,#upload,它基本上接收文件选项或一些文本等参数。如果传递了文件 (File.open("test.txt",'r+')),upload(:file => ...) ,则此方法从文件中读取文本,或者如果有人决定传递完全相同的文本只是不在 txt 文件中,他可以上传 (:content => ...)

但我需要一个包含文本的文件或传递的文本本身,您将如何处理?

这是我目前所拥有的。

 def upload(args)
if args[:content].present?
self.content = args[:content]
elsif args[:file].present?
self.content = args[:file].read
end
end

谢谢!

最佳答案

解决方案一

如果参数的类别不同(StringFile),那么您可以在 case 构造中使用它。您不需要更多信息来区分它。

def upload(arg)
self.content =
case arg
when String; arg
when File; arg.read
end
end

方案二

受 Nemo157 的评论启发而添加

利用面向对象编程的多态性,你可以这样做:

def upload(arg); self.content = arg.upload end
class String
def upload; self end
end
class File
def upload; read end
end

关于多态的一些注意事项

通常,我们在同一个词下指的是相似但不同的 Action 。例如,考虑日常生活中的单词 add:我们以不同的含义使用它:向 jar 里加水,将 3 加到 1,添加注释,将蓝色阴影添加到绿色油漆,等等。它们具有不同的含义,但我们的直觉是它们之间存在某种关联。区分这些含义的一种方法是使用不同的词,例如 liquid-add、number-add、context-add,或者您可以对它们进行编号,例如 add1、add2、add3,但这是一团糟。但是,请注意它们的含义在很大程度上取决于它所断言的对象的类型:取决于它是否是液体、数字、话语等,“添加”的适当含义而定。多态性的思想利用了这一事实,并将其应用于编程。在这种情况下,“上传”将具有不同的含义,具体取决于它是关于字符串还是文件。但只要它们是在各自的类中定义的,你在使用它们时就不必关心它们的区别。因此,您从 case 语句中解放出来,并使代码更简单。

关于ruby 如何有两个可选参数但至少需要一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947232/

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