一次性做到这一点?

Ski*_*zit 0 ruby

while(i < bArray.length)
  if(aArray.include?(bArray[i]) == false) then
    return false
  end
  i+=1
end
Run Code Online (Sandbox Code Playgroud)

我已经写了上面的内容,但我觉得它很丑陋.在一个声明中必须有一个干净的方法来做到这一点..但是如何?

Jor*_*ing 6

这应该是等价的:

while i < bArray.length
  return false unless aArray.include?(bArray[i])

  i += 1
end
Run Code Online (Sandbox Code Playgroud)

这是一个我认为应该相同的单线程:

bArray.all? { |item| aArray.include?(item) }
Run Code Online (Sandbox Code Playgroud)


the*_*Man 5

看起来你正试图找出aArray是否包含bArray的所有元素.

aArray = %w[a b c d]
bArray = %w[a b c z]

(bArray - aArray).empty? # => false
Run Code Online (Sandbox Code Playgroud)

我仔细看了一下原始代码,它有一个逻辑炸弹滴答作响:

def cmp_array(aArray, bArray)
  i = 0
  while (i < bArray.length)
    if (aArray.include?(bArray[i]) == false) then
      return false
    end
    i += 1
  end
end

def cmp_array2(a, b)
  (b - a).empty?
end

cmp_array( %w[ a b c ], %w[ a b c   ]) # => nil
cmp_array( %w[ a b c ], %w[ c b a   ]) # => nil
cmp_array( %w[ a b c ], %w[ a b     ]) # => nil
cmp_array( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array( %w[ a b   ], %w[ a b c   ]) # => false

cmp_array2( %w[ a b c ], %w[ a b c   ]) # => true
cmp_array2( %w[ a b c ], %w[ c b a   ]) # => true
cmp_array2( %w[ a b c ], %w[ a b     ]) # => true
cmp_array2( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array2( %w[ a b   ], %w[ a b c   ]) # => false
Run Code Online (Sandbox Code Playgroud)

我不得不添加i = 0初始化程序,否则Ruby抱怨未初始化的变量.

请注意,cmp_array返回nil或false,强制执行其他测试nil?false?执行有用的操作.

if (cmp_array( %w[ a b c ], %w[ a b c   ]).nil?) ...
Run Code Online (Sandbox Code Playgroud)

要么:

if (cmp_array( %w[ a b c ], %w[ a b c d ]).false?) ...
Run Code Online (Sandbox Code Playgroud)

相比:

if (cmp_array2( %w[ a b c ], %w[ a b c   ])) ...
Run Code Online (Sandbox Code Playgroud)

它始终如一地返回真/假.