English 中文(简体)
如何提出两个任择论点,但至少需要一个论点?
原标题:ruby how to have two optional arguments but need at least one present?
  • 时间:2011-05-10 08:24:24
  •  标签:
  • ruby

我有这一方法,即“顶点”,基本上包括其他论点、档案选择或某些案文。 如果卷宗(File. open(“test.txt”, r+ )通过,上载(: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

感谢!

最佳回答

<>Solution 1

如果争论的类别不同(String vsFile),则你可在case的建筑中使用该词。 你不需要进一步的资料来区分这一点。

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

<<>Solution 2

在Nemo157评论的启发下通过

采用以目标为导向的方案规划的多形态,你可以这样做:

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

www.un.org/Depts/DGACM/index_spanish.htm 关于多吗?

我们常常在同一个词下提及类似但不同的行动。 例如,在普通生活中考虑“add<>/code>:我们用这个词的意思不同:在焦炭中添加水,增加3至1,增加评论,在绿色油漆中添加蓝.,等等。 它们具有不同的含义,但我们有某种关联的直觉。 区分这些含义的一种办法是使用不同的词语,如液体添加、编号增加、环境增加等,或者说你可以把这些词语编成添加1、增加2、增加3,但这只是一个小点。 然而,注意到其含义主要取决于所确定物体的类型:取决于其是否具有液体、数量、讨论等,以及确定“附加”的适当含义。 多种形态的概念使用这一事实,并将其应用于方案拟订。 在此处,“上载”的意思不同,取决于它是否涉及护卫或档案。 但是,只要他们在各自的班级内界定,你就不必在你使用时注意差异。 因此,你没有案件说明,使法典更加简单。

问题回答

你是否特别希望把这一论点当作 has? 否则,我就谈一下:

def upload(args)
  if args.respond_to? :read
    self.content = args.read
  else
    self.content = args.to_s # This allows non-string arguments.
  end
end

这只是对方法的检验,就像方法一样。

def upload(args)
  if args[:content].present?
    self.content = args[:content]
  elsif args[:file].present?
    self.content = args[:file].read
  else
    raise ArgumentError,  one of :content or :file must be given 
  end
end

EDIT: 仅使用单一论点和uck制的替代办法

def upload(arg)
  if arg.respond_to? :to_str
    self.content = arg.to_str
  elsif arg.respond_to? :read
    self.content = arg.read
  else
    raise ArgumentError,  a String-like or IO-like object must be given 
  end
end

Similar to the other two but with what I feel are a couple of improvements

  • 这是指只要采用正确的方法,就可以使用其他类别。 主要是,除了普通档案外,还允许其他形式的国际独立实体。 也许可以采取分门别类的做法,但这不是比罗的要求。

  • 利用to_str,而不是to_s,每一类均采用to_s 方法,一米假设您不再希望上载#<MyClass:0x523e>., 而另一类则只采用专门可转换为扼制的类别。





相关问题
Ruby parser in Java

The project I m doing is written in Java and parsers source code files. (Java src up to now). Now I d like to enable parsing Ruby code as well. Therefore I am looking for a parser in Java that parses ...

rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

multiple ruby extension modules under one directory

Can sources for discrete ruby extension modules live in the same directory, controlled by the same extconf.rb script? Background: I ve a project with two extension modules, foo.so and bar.so which ...

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...