Существует ли причина, что мы не можем выполнить итерации на “обратном Диапазоне” в рубине?

Я обычно работаю с массивами:

Sub Test1()

Dim rngnumbers    As Excel.Range

Dim arrVals       As variant 

Dim lngRow        As long

Arrvals = Sheet2.Range("C2:F999").value

    For Lngrow = lbound(arrvals,1) to ubound(arrvals,1)
        If arrvals(lngrow,4) >= 100 Then
                If arrvals(lngrow,1)= "John" Or arrvals(lngrow,1) = "Tom" Then '''The problem here is that it only looks at the cell C2 and not the adjacent cell
                    Sheet1.Range("I999").End(xlUp).Offset(1, 0).Value = arrvals(lngrow,4)
                Else
                End If
        End If
    Next lngrow 

End Sub

На самом деле, я бы тоже, вероятно, построил выходной массив, но мой большой палец устал ...

98
задан the Tin Man 9 February 2016 в 23:19
поделиться

7 ответов

Диапазон в том, что: что-то определенное его началом и концом не по его содержанию. «Итализация» в течение ряда на самом деле не имеет смысла в общем случае. Подумайте, например, как вы «итерация» по диапазону, произведенному двумя датами. Вы бы итерации за день? к месяцу? к году? на неделю? Это не четко определено. ИМО, тот факт, что это разрешено для форвардных диапазонов, следует рассматривать только как удобный метод.

Если вы хотите обратиться за обратным направлением, подобный таким образом, вы всегда можете использовать downto :

$ r = 10..6
=> 10..6

$ (r.first).downto(r.last).each { |i| puts i }
10
9
8
7
6

вот здесь некоторые больше мыслей от других, почему это трудно обоим Итерация и последовательно занимаются обратным диапазонами.

93
ответ дан 24 November 2019 в 05:12
поделиться

Что касается меня самый простой путь:

[*0..9].reverse

Другой способ выполнить итерации для перечисления:

(1..3).reverse_each{|v| p v}
0
ответ дан 24 November 2019 в 05:12
поделиться

Я добавляю одну возможность реализовать итерацию в течение обратного диапазона. Я не использую его, но это возможность. Это немного рискованно для обезьяны патч рубиновых объектов.

class Range

  def each(&block)
    direction = (first<=last ? 1 : -1)
    i = first
    not_reached_the_end = if first<=last
                            lambda {|i| i<=last}
                          else
                            lambda {|i| i>=last}
                          end
    while not_reached_the_end.call(i)
      yield i
      i += direction
    end
  end
end
1
ответ дан 24 November 2019 в 05:12
поделиться

Итализатор по диапазону в Ruby с каждый вызывает метод метода на первом объекте в диапазоне.

$ 4.succ
=> 5

и 5 находится за пределами диапазона.

Вы можете моделировать обратную итерацию с этим взломом:

(-4..0).each { |n| puts n.abs }

Иоанн отметил, что это не будет работать, если она пропанами 0. Это будет:

>> (-2..2).each { |n| puts -n }
2
1
0
-1
-2
=> -2..2

не может сказать, что мне действительно нравится кто-либо из них, потому что они видны неясными намерение.

18
ответ дан 24 November 2019 в 05:12
поделиться

Возможность создавать элементы на лету более простым способом, передавая все атрибуты в качестве второго аргумента jQuery () :

jQuery('<div/>', {
    id: 'foo',
    mouseenter: function() {
        // do stuff
    },
    html: jQuery('<a/>', {
        href: 'http://google.com',
        click: function() {
            // do stuff
        }
    })
});

Все свойства, не являющиеся атрибутами, сопоставляются с соответствующим методом jQuery. Таким образом, html вызовет .html () и click свяжет новое событие click через .click () ...

-121--1002657-

Для меня это было так:

"Все события могут быть живыми событиями"

"Мы очень горды считать некоторые дополнительные события среди них поддерживается live (). 1.4 вводит поддержка изменений между браузерами, подчиниться, сосредоточение, focusout, mouseenter, и mouselave через событие делегирование в .live () ".

Я ждал этого на событии изменений в течение многих лет!

-121--1002654-

, если список не такой большой. я думаю, [* 0.. 4] .reverse.each {| i | puts i} Это самый простой способ.

3
ответ дан 24 November 2019 в 05:12
поделиться

Согласно книге "Programming Ruby", объект Range хранит две конечные точки диапазона и использует член .succ для генерации промежуточных значений. В зависимости от того, какой тип данных вы используете в вашем диапазоне, вы всегда можете создать подкласс Integer и переопределить член .succ так, чтобы он действовал как обратный итератор (вероятно, вы также захотите переопределить .next).

Вы также можете достичь искомых результатов без использования диапазона. Попробуйте так:

4.step(0, -1) do |i|
    puts i
end

Это будет шаг от 4 до 0 с шагом -1. Однако, я не знаю, сработает ли это для чего-нибудь, кроме целочисленных аргументов.

12
ответ дан 24 November 2019 в 05:12
поделиться

Я не уверен, будет ли это полезно для вас, но это был бы довольно простой способ сделать это, не уверен в точной «скорости» этого, хотя.

List<string> collection = new List<string>();

collection.Sort();

foreach(string value in collection)
{
   if(value == "stringToLookFor")
   {
       return value;
   }
{
-121--2681531-

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

-121--2304521-

Как уже говорилось, причина заключается в том, что Range # каждый отправляет succ в его начало, затем в результат этого succ вызова и так далее, пока результат не будет больше конечного значения. Вы не можете добраться от 4 до 0, вызвав succ , и фактически вы уже начинаете больше конца.

1
ответ дан 24 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

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