循环仅返回最后一项

时间:2012-01-15 15:20:27

标签: ruby loops

我是Ruby的新手,所以答案可能非常简单。不是我,但

我正在获取一个字符串数组(A)并将其与另一个字符串数组(B)进行匹配,以查看来自(A)的给定字符串是否作为B中字符串中的子字符串存在。

比较似乎有效,但我只从最后一个(A)字符串中得到结果。

这可能是什么?

def checkIfAvailableOnline(film)

    puts "Looking for " + film
    lowerCaseFilm = film.downcase

    #iterate through the linesarray scanning for the film in question

    for line in @linesArray
        #get the line in lowercase
        lowerCaseLine = line.downcase

        #look for the film name as a substring within the line
        results = lowerCaseLine.scan(lowerCaseFilm)

        if results.length > 0 
            @availableOnlineArray << results
        end
    end

end
#-----------------------------------------

listFilmsArray.each {|line| checkIfAvailableOnline(line)} 

2 个答案:

答案 0 :(得分:1)

给出一系列电影名称:

FILM_NAMES = [
  'Baked Blue Tomatoes',
  'Fried Yellow Tomatoes',
  'The thing that ate my homework',
  'In a world where',
]

然后找到包含子串的所有电影名称,忽略大小写:

def find_films_available_online(partial_film_name)
  FILM_NAMES.find_all do |film_name|
    film_name.downcase[partial_film_name.downcase]
  end
end

p find_films_available_online('tomatoes')
# => ["Baked Blue Tomatoes", "Fried Yellow Tomatoes"]

p find_films_available_online('godzooka')
# => []

要了解电影名称是否可在线获取:

def available_online?(partial_film_name)
  !find_films_available_online(partial_film_name).empty?
end

p available_online?('potatoes')   # => false
p available_online?('A World')    # => true

要了解哪些部分电影名称可在线获取:

def partial_film_names_available_online(partial_film_names)
  partial_film_names.find_all do |partial_film_name|
    available_online?(partial_film_name)
  end
end

p partial_film_names_available_online [
    'tomatoes',
    'potatoes',
    'A World',
  ]
# => ["tomatoes", "A World"]

答案 1 :(得分:0)

更为谨慎的做法是:

鉴于我们正在寻找一系列电影:

@films = ["how to train your dragon", "kung fu panda", "avatar"]

给出一系列可能包含我们正在寻找的电影的行:

@lines_array = ["just in kung fu panda", "available soon how to train your dragon"]

如果电影名称存在于一行中,则提前返回;如果在搜索完所有行后没有,则返回false:

def online_available(film)
  @lines_array.each do |l|
    l.downcase.include?(film) ? (return film) : false
  end
  false
end

检查线条中拒绝返回false的影片,打印它们并最终返回我们找到的匹配数组:

def films_available
  available = @films.collect{ |x| p "Looking for: #{x}"; online_available(x) }
                    .reject{ |x| x == false }
  available.each{|x| p "Found: #{x}"}
  available
end

在使用Ruby的方法名称中使用camel-case被认为是不好的风格,但你知道他们对意见的看法。

.each是一个内部迭代器,我很确定“for”循环的运行速度会慢于数组继承的每个可枚举方法。