Отобразите массив, изменяющий только элементы, соответствующие определенному условию

Затем создайте два диалоговых окна прогресса, один над другим, пропустите сначала один, а другой через 2 секунды. Это будет работать

19
задан the Tin Man 7 December 2011 в 22:57
поделиться

6 ответов

Я соглашаюсь, что оператор карты хорош как есть. Это ясно и просто, и было бы легкий для любого поддержать.

, Если Вы хотите что-то более сложное, как насчет этого?

module Enumerable
  def enum_filter(&filter)
    FilteredEnumerator.new(self, &filter)
  end
  alias :on :enum_filter
  class FilteredEnumerator
    include Enumerable
    def initialize(enum, &filter)
      @enum, @filter = enum, filter
      if enum.respond_to?(:map!)
        def self.map!
          @enum.map! { |elt| @filter[elt] ? yield(elt) : elt }
        end
      end
    end
    def each
      @enum.each { |elt| yield(elt) if @filter[elt] }
    end
    def each_with_index
      @enum.each_with_index { |elt,index| yield(elt, index) if @filter[elt] } 
    end
    def map
      @enum.map { |elt| @filter[elt] ? yield(elt) : elt }
    end
    alias :and :enum_filter
    def or
      FilteredEnumerator.new(@enum) { |elt| @filter[elt] || yield(elt) }
    end
  end
end

%w{ a b c }.on { |x| x == 'b' }.map { |x| x + "!" } #=> [ 'a', 'b!', 'c' ]

require 'set'
Set.new(%w{ He likes dogs}).on { |x| x.length % 2 == 0 }.map! { |x| x.reverse } #=> #<Set: {"likes", "eH", "sgod"}>

('a'..'z').on { |x| x[0] % 6 == 0 }.or { |x| 'aeiouy'[x] }.to_a.join #=> "aefiloruxy"
6
ответ дан 30 November 2019 в 02:42
поделиться

Поскольку массивы являются указателями, это также работает:

a = ["hello", "to", "you", "dude"]
a.select {|i| i.length <= 3 }.each {|i| i << "!" }

puts a.inspect
# => ["hello", "to!", "you!", "dude"]

В цикле, удостоверьтесь, что Вы используете метод, который изменяет объект вместо того, чтобы создать новый объект. Например, upcase! по сравнению с upcase.

точная процедура зависит от того, чего точно Вы пытаетесь достигнуть. Трудно закрепить определенный ответ с примерами панели нечто.

25
ответ дан 30 November 2019 в 02:42
поделиться
old_a.map! { |a| a == "b" ? a + "!" : a }

дает

=> ["a", "b!", "c"]

map!, изменяет получатель на месте, таким образом old_a то, теперь, когда возвращенный массив.

9
ответ дан 30 November 2019 в 02:42
поделиться

Ваш map решением является лучшее. Я не уверен, почему Вы думаете, что map_modifying_only_elements_where так или иначе лучше. Используя map является более чистым, более кратким, и не требует нескольких блоков.

3
ответ дан 30 November 2019 в 02:42
поделиться

Если Вам не нужен старый массив, я предпочитаю карту! в этом случае, потому что можно использовать! метод для представления Вас изменяет массив на месте.

self.answers.map!{ |x| (x=="b" ? x+"!" : x) }

я предпочитаю это:

new_map = self.old_map{ |x| (x=="b" ? x+"!" : x) }
1
ответ дан 30 November 2019 в 02:42
поделиться

Это - несколько строк долго, но здесь является альтернативой для ада его:

oa = %w| a b c |
na = oa.partition { |a| a == 'b' }
na.first.collect! { |a| a+'!' }
na.flatten! #Add .sort! here if you wish
p na
# >> ["b!", "a", "c"]

собирание с троичным кажется лучшим, по-моему.

1
ответ дан 30 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: