[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.
    1. 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.
      1. 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.
        1. Flcn

          Flcn Member

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

          p.s. тоесть после ретурна всё прекращается? и другие элементы массива уже не трогаются?
          дак а если ретурн в блоке не ставить.. просто написать { |n, value| n = n + value}
          то это всё также не работает.. и возвращает 0
           
          1. 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;}
             
            1. login999

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

              Joined:
              12 Jun 2008
              Messages:
              491
              Likes Received:
              280
              Reputations:
              92
              В Ruby есть GIL aka Global Interpreter Lock?
              И если нету, то дайте пожалуйста пример элементарного многопоточного приложения ...
              Это просто интерес, не более того )
               
              1. 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.
                1. 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
                  
                   
                  1. 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.
                    то есть метка конца строки не должна иметь индентацию, но если это нужно перед меткой надо написать "-"
                     
                    1. Flcn

                      Flcn Member

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

                        superboy4 Banned

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


                        curb
                        curl-multi
                         
                        1. roddik

                          roddik Member

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

                              Flcn Member

                              Joined:
                              6 Jul 2009
                              Messages:
                              56
                              Likes Received:
                              6
                              Reputations:
                              0
                              1) скрипт в студию
                              2) попробую всеже быть телепатом. консоль закрывается после выполнения скрипта?
                              нажми выполнить и набери cmd . а лучше ставль linux
                               
                              1. 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
                                1. Excalibur

                                  Excalibur New Member

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

                                    superboy4 Banned

                                    Joined:
                                    17 Jul 2007
                                    Messages:
                                    151
                                    Likes Received:
                                    19
                                    Reputations:
                                    -8
                                    То есть ты говоришь если кликнуть по иконке скрипта, чтобы его запустить?
                                    Нет, ведь они выполняются из консоли всегда, это не самостоятельные программы.
                                     
                                    1. 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.
                                      1. 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"
                                        #Кликаем по кнопке 'Вход'
                                        .....
                                        Иссяк. Не могу осуществить логин, так как не знаю как добраться до кнопки "Вход"
                                        помогите..
                                         
                                        1. 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.