ruby 在一个函数中反转2个条件

eivgtgni  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(95)

我不确定这是否是描述我想要实现的目标的最佳标题,但我基本上有2个条件:
1.第一个月

  1. required_file.early?
if current_file.early? && !required_file.early? do
...
end

if !current_file.early? && required_file.early? do
...
end

字符串
我想我已经看了很久了,但我想知道是否有更简单的方法来简化它,因为它们本质上是彼此的逆。我知道我可以做嵌套的如果,

current_file.early?
 !required_file.early? && do_something
 required_file.early? && do_something_else


但这也不是我想要的我想找个更优雅的如果有的话。

qvsjd97n

qvsjd97n1#

也许是一个案例陈述:

case [current_file.early?, required_file.early?]
when [true, false]
  "do something"
when [false, true]
  "do anything"
end

字符串

kmb7vmvb

kmb7vmvb2#

为所有可能的条件构建真值表,如下所示:

Horizontal: current_file.early?
Vertical: requited_file.early?

        true    false
true    noop    first
false   second  noop

字符串
实际上有三种不同的结果:当第一条件为真时,当第二条件为真时,否则-无操作(noop)。
为了使代码清晰,最好将每个条件定义为具有有意义名称的单独方法。

def first_cond?
  current_file.early? && !requited_file.early?
end

def second_cond?
  !current_file.early? && requited_file.early?
end

if first_cond?
  # when first condition
elsif second_cond?
  # when second condition
else
  # noop
end


是的,没有更短或优雅的方法来简化给定的条件对(就形式逻辑及其规则而言)。

mklgxw1f

mklgxw1f3#

您可以selectearly?的文件,并将它们与预期结果进行比较:

early_files = [current_file, required_file].select(&:early?)

if early_files == [current_file]
  # ...
elsif early_files == [required_file]
  # ...
end

字符串
其他可能的结果是early_files == [](没有文件是早期的)和early_files == [current_file, required_file](两个文件都是早期的)。
case语句也可以工作:(注意括号是必填项)

case [current_file, required_file].select(&:early?)
when [current_file]
  # ...
when [required_file]
  # ...
end


在上面的两个例子中,early?在每个文件中只被调用一次。

相关问题