[Ruby] - Задай вопрос, получи ответ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sharky, 24 Aug 2009.

  1. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    В этой специальной теме новички могут задавать простые вопросы по языку Ruby и всему что с ним связано.
     
    3 people like this.
  2. Flcn

    Flcn Member

    Joined:
    6 Jul 2009
    Messages:
    56
    Likes Received:
    6
    Reputations:
    0
    ок.
    буду первым. недавно начал изучение. вопрос вызвал один код
    Code:
    class Array
      def inject(n)
         each { |value| n = yield(n, value) }
         n
      end
      def sum
        inject(0) { |n, value| n + value }
      end
      def product
        inject(1) { |n, value| n * value }
      end
    end
    здесь всё работает, и я отлично понимаю как..
    но вот если его изменить на
    Code:
    class Array
      def inject(n)
         each { |value| yield(n, value) }
         n
      end
      def sum
        inject(0) { |n, value|n =  n + value; return n}
      end
      def product
        inject(1) { |n, value|n =  n * value; return n}
      end
    end
    то работать он перестаёт. при суммировании он возвращает тока первый элемент. думаю надо копать в сторону локальности переменных. но понять точно не могу. видимо у меня немного не правильное понимание работы блоков. Зарание благодарен
     
    1 person likes this.
  3. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    yield в функции inject инвокирует(вызвает исполнение) кодблока переданного функции inject.
    то есть суммирование происходит по настоящему в функции inject,
    алсо return вызывает выход из функции а не из кодблока.
    поэтому то как ты переписал класс- бред. имхо.
     
    1 person likes this.
  4. Flcn

    Flcn Member

    Joined:
    6 Jul 2009
    Messages:
    56
    Likes Received:
    6
    Reputations:
    0
    Я понимаю что это бред ) Просто вызвал вопрос как оно всё же работает.. и почему конкретно...

    p.s. тоесть после ретурна всё прекращается? и другие элементы массива уже не трогаются?
    дак а если ретурн в блоке не ставить.. просто написать { |n, value| n = n + value}
    то это всё также не работает.. и возвращает 0
     
  5. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    Ноль возвращается потому что
    в инжекте не увеличивается n
    оно как пришло inject(0) , так нулем и осталось.
    Code:
      def inject(n)
         each { |value| yield(n, value) }
         n
      end
    а в кодблоке n уже другое n - локальное для кодблока.
    { |n, value|n = n + value;}
     
  6. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    В Ruby есть GIL aka Global Interpreter Lock?
    И если нету, то дайте пожалуйста пример элементарного многопоточного приложения ...
    Это просто интерес, не более того )
     
  7. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    В Руби есть Global VM Lock, но появился он только в интерпретаторе начиная с версии 1.9.
    и для 1.8
    канонический пример (=
    Code:
    require 'net/http'
    
    
    pages = %w( forum.antichat.ru habrahabr.ru ya.ru)
    threads = []
    
    
    for page in pages
      threads << Thread.new(page) { |myPage|
        h = Net::HTTP.new(myPage, 80)
        puts "Loading: #{myPage}"
        resp, data = h.get('/', nil )
        puts "Finished #{myPage}:  #{resp.message}"
      }
    end
    threads.each { |thread|  thread.join }
    
     
    1 person likes this.
  8. Flcn

    Flcn Member

    Joined:
    6 Jul 2009
    Messages:
    56
    Likes Received:
    6
    Reputations:
    0
    А что означает вот этот код?
    Code:
    aString = <<END_OF_STRING
        The body of the string
        is the input lines up to
        one ending with the same
        text that followed the '<<'
    END_OF_STRING
    а то я что то не догнал..
    особенно вот такой пример
    Code:
    print <<-STRING1, <<-STRING2
       Concat
       STRING1
          enate
          STRING2
    
     
  9. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    ммм... на каком уровне ты знаешь английский ?
    в первом коде дано объяснение
    The body of the string
    is the input lines up to
    one ending with the same
    text that followed the '<<'
    то есть '<<' - метка начала строки, а то что написано за ней END_OF_STRING - метка окончания строки.

    Дальше по тексту
    A here document consists of lines in the source up to, but not including, the terminating string that you specify after the << characters. Normally, this terminator must start in the first column. However, if you put a minus sign after the << characters, you can indent the terminator.
    то есть метка конца строки не должна иметь индентацию, но если это нужно перед меткой надо написать "-"
     
  10. Flcn

    Flcn Member

    Joined:
    6 Jul 2009
    Messages:
    56
    Likes Received:
    6
    Reputations:
    0
    да я второй пример плохо понял.. вернее не был уверне что правильна.. а интерпретатора небыло дня три.. вот и запстил.. я надеюсь правильно понял что есть есть - то другие строки исключаются?
     
  11. superboy4

    superboy4 Banned

    Joined:
    17 Jul 2007
    Messages:
    151
    Likes Received:
    19
    Reputations:
    -8
    Информация об установке Curl в Ruby


    curb
    curl-multi
     
  12. roddik

    roddik Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    13
    Reputations:
    0
    вместо курла намного удобнее использовать open-uri или mechanize или watir или selenium или webrat
     
    2 people like this.
  13. Excalibur

    Excalibur New Member

    Joined:
    4 Sep 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Начал изучение с книжки Криса Пайна и сразу же наткнулся на грабли: как только запускаю сохраненный скрипт он так быстро выполняется в консольном окне что не видно даже результата, что делать?
     
    #13 Excalibur, 4 Sep 2009
    Last edited: 4 Sep 2009
    1 person likes this.
  14. Flcn

    Flcn Member

    Joined:
    6 Jul 2009
    Messages:
    56
    Likes Received:
    6
    Reputations:
    0
    1) скрипт в студию
    2) попробую всеже быть телепатом. консоль закрывается после выполнения скрипта?
    нажми выполнить и набери cmd . а лучше ставль linux
     
  15. superboy4

    superboy4 Banned

    Joined:
    17 Jul 2007
    Messages:
    151
    Likes Received:
    19
    Reputations:
    -8
    To Excalibur
    Не ставь Linux, раз сидишь под Windows
    Чтобы окно не закрывалось используй CMD

    //////////////////////////////////////////

    Я установил Watir.
    gem install watir
    Как его теперь полностью удалить?
     
    #15 superboy4, 5 Sep 2009
    Last edited: 5 Sep 2009
  16. Excalibur

    Excalibur New Member

    Joined:
    4 Sep 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    да причём тут скрипт, пусть будет просто puts 2+2
    C:\ruby>test.rb так получилось, а просто двойным кликом по скрипту не как?
     
  17. superboy4

    superboy4 Banned

    Joined:
    17 Jul 2007
    Messages:
    151
    Likes Received:
    19
    Reputations:
    -8
    То есть ты говоришь если кликнуть по иконке скрипта, чтобы его запустить?
    Нет, ведь они выполняются из консоли всегда, это не самостоятельные программы.
     
  18. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    Так, детки, не ссоримся.

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

    superboy4, тебе гем мешает ?
    удалять гемы можно командой
    gem uninstall имя_гема
     
    #18 geezer.code, 5 Sep 2009
    Last edited: 5 Sep 2009
    1 person likes this.
  19. superboy4

    superboy4 Banned

    Joined:
    17 Jul 2007
    Messages:
    151
    Likes Received:
    19
    Reputations:
    -8
    PHP:
    require "watir"

    #Адрес сайта
    site_url "http://vkontakte.ru"
    #открываем обозреватель IE
    ie Watir::IE.new
    #перейти на сайт
    ie.goto site_url
    #Заполняем поля ввода
    ie.text_field(:name"email").set "[email protected]"
    ie.text_field(:name"pass").set "rebzone"
    #Кликаем по кнопке 'Вход'
    .....
    Иссяк. Не могу осуществить логин, так как не знаю как добраться до кнопки "Вход"
    помогите..
     
  20. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    watir потестить не могу. потому как он для win32.
    но думаю что нужно копать в сторону исполнения яваскриптов.
    http://justaddwater.dk/2007/11/20/how-to-run-javascript-from-watir-scripts/
     
    1 person likes this.