В этой специальной теме новички могут задавать простые вопросы по языку Ruby и всему что с ним связано.
ок. буду первым. недавно начал изучение. вопрос вызвал один код 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 то работать он перестаёт. при суммировании он возвращает тока первый элемент. думаю надо копать в сторону локальности переменных. но понять точно не могу. видимо у меня немного не правильное понимание работы блоков. Зарание благодарен
yield в функции inject инвокирует(вызвает исполнение) кодблока переданного функции inject. то есть суммирование происходит по настоящему в функции inject, алсо return вызывает выход из функции а не из кодблока. поэтому то как ты переписал класс- бред. имхо.
Я понимаю что это бред ) Просто вызвал вопрос как оно всё же работает.. и почему конкретно... p.s. тоесть после ретурна всё прекращается? и другие элементы массива уже не трогаются? дак а если ретурн в блоке не ставить.. просто написать { |n, value| n = n + value} то это всё также не работает.. и возвращает 0
Ноль возвращается потому что в инжекте не увеличивается n оно как пришло inject(0) , так нулем и осталось. Code: def inject(n) each { |value| yield(n, value) } n end а в кодблоке n уже другое n - локальное для кодблока. { |n, value|n = n + value;}
В Ruby есть GIL aka Global Interpreter Lock? И если нету, то дайте пожалуйста пример элементарного многопоточного приложения ... Это просто интерес, не более того )
В Руби есть 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 }
А что означает вот этот код? 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
ммм... на каком уровне ты знаешь английский ? в первом коде дано объяснение 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) скрипт в студию 2) попробую всеже быть телепатом. консоль закрывается после выполнения скрипта? нажми выполнить и набери cmd . а лучше ставль linux
To Excalibur Не ставь Linux, раз сидишь под Windows Чтобы окно не закрывалось используй CMD ////////////////////////////////////////// Я установил Watir. gem install watir Как его теперь полностью удалить?
да причём тут скрипт, пусть будет просто puts 2+2 C:\ruby>test.rb так получилось, а просто двойным кликом по скрипту не как?
То есть ты говоришь если кликнуть по иконке скрипта, чтобы его запустить? Нет, ведь они выполняются из консоли всегда, это не самостоятельные программы.
Так, детки, не ссоримся. Excalibur, чтобы увидеть результат программы достаточно в конец скрипта поставить gets, тогда скрипт будет ожидать нажатия любой клавиши. superboy4, тебе гем мешает ? удалять гемы можно командой gem uninstall имя_гема
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" #Кликаем по кнопке 'Вход' ..... Иссяк. Не могу осуществить логин, так как не знаю как добраться до кнопки "Вход" помогите..
watir потестить не могу. потому как он для win32. но думаю что нужно копать в сторону исполнения яваскриптов. http://justaddwater.dk/2007/11/20/how-to-run-javascript-from-watir-scripts/