Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   [Ruby] - Задай вопрос, получи ответ (https://forum.antichat.xyz/showthread.php?t=137015)

Sharky 24.08.2009 12:21

[Ruby] - Задай вопрос, получи ответ
 
В этой специальной теме новички могут задавать простые вопросы по языку Ruby и всему что с ним связано.

Flcn 24.08.2009 15:25

ок.
буду первым. недавно начал изучение. вопрос вызвал один код
Код:

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

здесь всё работает, и я отлично понимаю как..
но вот если его изменить на
Код:

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

то работать он перестаёт. при суммировании он возвращает тока первый элемент. думаю надо копать в сторону локальности переменных. но понять точно не могу. видимо у меня немного не правильное понимание работы блоков. Зарание благодарен

geezer.code 24.08.2009 23:47

yield в функции inject инвокирует(вызвает исполнение) кодблока переданного функции inject.
то есть суммирование происходит по настоящему в функции inject,
алсо return вызывает выход из функции а не из кодблока.
поэтому то как ты переписал класс- бред. имхо.

Flcn 25.08.2009 00:50

Я понимаю что это бред ) Просто вызвал вопрос как оно всё же работает.. и почему конкретно...

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

geezer.code 25.08.2009 01:01

Цитата:

Сообщение от Flcn
Я понимаю что это бред ) Просто вызвал вопрос как оно всё же работает.. и почему конкретно...

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

Ноль возвращается потому что
в инжекте не увеличивается n
оно как пришло inject(0) , так нулем и осталось.
Код:

  def inject(n)
    each { |value| yield(n, value) }
    n
  end

а в кодблоке n уже другое n - локальное для кодблока.
{ |n, value|n = n + value;}

login999 25.08.2009 14:30

В Ruby есть GIL aka Global Interpreter Lock?
И если нету, то дайте пожалуйста пример элементарного многопоточного приложения ...
Это просто интерес, не более того )

geezer.code 25.08.2009 14:46

В Руби есть Global VM Lock, но появился он только в интерпретаторе начиная с версии 1.9.
и для 1.8
канонический пример (=
Код:

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 }


Flcn 30.08.2009 01:12

А что означает вот этот код?
Код:

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

а то я что то не догнал..
особенно вот такой пример
Код:

print <<-STRING1, <<-STRING2
  Concat
  STRING1
      enate
      STRING2


geezer.code 30.08.2009 11:55

Цитата:

Сообщение от Flcn
А что означает вот этот код?
Код:

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

а то я что то не догнал..
особенно вот такой пример
Код:

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.
то есть метка конца строки не должна иметь индентацию, но если это нужно перед меткой надо написать "-"

Flcn 04.09.2009 17:46

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

superboy4 04.09.2009 19:42

Информация об установке Curl в Ruby


curb
curl-multi

roddik 04.09.2009 19:52

вместо курла намного удобнее использовать open-uri или mechanize или watir или selenium или webrat

Excalibur 04.09.2009 23:49

Начал изучение с книжки Криса Пайна и сразу же наткнулся на грабли: как только запускаю сохраненный скрипт он так быстро выполняется в консольном окне что не видно даже результата, что делать?

Flcn 05.09.2009 02:13

1) скрипт в студию
2) попробую всеже быть телепатом. консоль закрывается после выполнения скрипта?
нажми выполнить и набери cmd . а лучше ставль linux

superboy4 05.09.2009 07:35

To Excalibur
Не ставь Linux, раз сидишь под Windows
Чтобы окно не закрывалось используй CMD

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

Я установил Watir.
gem install watir
Как его теперь полностью удалить?

Excalibur 05.09.2009 10:15

да причём тут скрипт, пусть будет просто puts 2+2
C:\ruby>test.rb так получилось, а просто двойным кликом по скрипту не как?

superboy4 05.09.2009 11:06

Цитата:

да причём тут скрипт, пусть будет просто puts 2+2
C:\ruby>test.rb так получилось, а просто двойным кликом по скрипту не как?
То есть ты говоришь если кликнуть по иконке скрипта, чтобы его запустить?
Нет, ведь они выполняются из консоли всегда, это не самостоятельные программы.

geezer.code 05.09.2009 11:17

Так, детки, не ссоримся.

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

superboy4, тебе гем мешает ?
удалять гемы можно командой
gem uninstall имя_гема

superboy4 05.09.2009 12:50

PHP код:

require "watir"

#Адрес сайта
site_url "http://vkontakte.ru"
#открываем обозреватель IE
ie Watir::IE.new
#перейти на сайт
ie.goto site_url
#Заполняем поля ввода
ie.text_field(:name"email").set "rebz@gmail.com"
ie.text_field(:name"pass").set "rebzone"
#Кликаем по кнопке 'Вход'
..... 

Иссяк. Не могу осуществить логин, так как не знаю как добраться до кнопки "Вход"
помогите..

geezer.code 05.09.2009 13:05

watir потестить не могу. потому как он для win32.
но думаю что нужно копать в сторону исполнения яваскриптов.
http://justaddwater.dk/2007/11/20/how-to-run-javascript-from-watir-scripts/

superboy4 05.09.2009 14:13

geezer.code

что-то я запыхался, английский знаю хорошо, а понять таки немогу
но тут точно через JavaScript делается..

superboy4 06.09.2009 15:16

geezer.code
Было бы хорошо, если бы ты помог, с php у меня нет проблем, там Curl и все дела, пересел на руби, так он уже начинает выводить из себя.

geezer.code 06.09.2009 16:31

перед использованием watir или какой другой библиотеки, попробуй сначала Net::HTTP .
Когда осовоишься пробуй уже чтонибудь. другое.

зы ну нет у меня руби на винде.

gisTy 06.09.2009 16:51

кстати, какую книгу посоветуете для изучения ruby?

Flcn 06.09.2009 17:13

я бы посоветовал http://www.ruby-doc.org/docs/ProgrammingRuby/
щас сам по ней изучаю.. пока почти всё понятно..

gisTy 06.09.2009 18:00

а что нибудь на русском есть почитать?

Excalibur 06.09.2009 18:26

Крис Пайн "Учись программировать"
Хэл Фултон "Программирование на языке Ruby"
Д. Томас, Д. Х. Хэнссон "Гибкая разработка веб-приложений в среде Rails"

Flcn 07.09.2009 01:18

ещё есть в викиучебнике достаточно неплохой справочник

geezer.code 07.09.2009 10:02

Учим английский, потом учимся программировать. (=

Приличные книги по Руби еще можно встретить на русском, а вот по рельсам - нет. Довольно слабый перевод, к тому же пока их переведут они успевают устареть.

от себя советую Programming Ruby: Progmatic Programmers' Guide и Design Patterns in Ruby.

gisTy 08.09.2009 00:41

Цитата:

Сообщение от geezer.code
Учим английский, потом учимся программировать. (=

Приличные книги по Руби еще можно встретить на русском, а вот по рельсам - нет. Довольно слабый перевод, к тому же пока их переведут они успевают устареть.

от себя советую Programming Ruby: Progmatic Programmers' Guide и Design Patterns in Ruby.

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

Flcn 08.09.2009 12:37

gisTy "английский я знаю, сидеть переводить " как то не сочитается )

на самом деле сам неособо знал английский.. а когда читаешь то
1) почти всё понятно..
2) код он и в африке код
3) если что непонятно то в соседней вкладке гугльтранслейт и он поможет..

Flcn 08.09.2009 17:20

и я снова задам вопрос..
вот пример из тойже книжки
удваиваем слешы
Код:

str = 'a\b\c'
str=str.gsub(/\\/, "\\\\\\")

почему работает именно "\\\\\\" ?

как это работает ? в моё понимании
заменяем все /\\/ - бекслешы на "\\" двойные. каким образом делается подстановка?

geezer.code 08.09.2009 17:29

Может уже стоит читать книжку внимательнее??
Цитата:

However, when the substitution occurs, the regular expression engine performs another pass through the string, converting "\\'' to "\'', so the net effect is to replace each single backslash with another single backslash. You need to write gsub(/\\/, '\\\\\\\\')!

Flcn 08.09.2009 19:01

geezer.code
я это читал)
но это не объясняет причину) я понял что это изза "движка" но почему он " replace each single backslash with another single backslash" вот это хотелось бы понять)

geezer.code 08.09.2009 20:21

the regular expression engine performs another pass through the string
что в этой строке не понятно ? )
таким образом строка при таком использовании пройдет через двиг регулярок дважды.

кстати чуть ниже написано , что если использовать кодблок
.gsub(str){} , то прогон через двиг регулярок будет один. слешей нужно в 2 раза меньше

superboy4 13.09.2009 11:27

При вызове контроллера получаю следующую ошибку.
invalid byte sequence in UTF-8

В чём же может быть проблема? Google ничего не знает.

FireFenix 13.09.2009 11:47

омг.... ты вообще гуглом ползовацо умеешь?

1 из первых 10 линков - http://po-ru.com/diary/fixing-invali...uby-revisited/

superboy4 13.09.2009 15:40

Цитата:

Сообщение от FireFenix
омг.... ты вообще гуглом ползовацо умеешь?

1 из первых 10 линков - http://po-ru.com/diary/fixing-invali...uby-revisited/

способ, описываемый в статье, применим только для Ruby проектов. Я получаю эту ошибку под rails,

PHP код:

[HTML]<% form_for :photo, :html => { :multipart => true } do |form| %>   <label for="first_name">Имя:</label>   <%= form.text_field :first_name %>   <label for="last_name">Фамилия:</label>   <%= form.text_field :last_name %>   <label for="file">Загружаемый файл:</label>   <%= form.file_field :picture %>   <%= submit_tag "Залить" %>  <% end %>[/HTML

обращаюсь к localhost:3000/upload/
выводится ошибка invalid byte sequence in UTF-8
форма, даже не показывается...

geezer.code 14.09.2009 09:17

Ты пользуешься Руби 1.9 ?
это все еще нестабильная ветка, и многие вещи там могут не работать.
Откатись на 1.8.*
Эта проблема еще висит в тикетах на лайтхаузе
https://rails.lighthouseapp.com/projects/8994/tickets/2476

superboy4 18.09.2009 13:57

Юзаю Руби 1.8
Обращаюсь к контроллёру Upload и получаю следующие ошибки, причём под Руби 1.9 они не всплывали

compile error
C:/Users/BitNami RubyStack projects/killerapp/app/views/upload/index.html.erb:6: unterminated string meets end of file
C:/Users/BitNami RubyStack projects/killerapp/app/views/upload/index.html.erb:6: syntax error, unexpected $end, expecting ')'

А вот код странички вьюшки index
PHP код:

<% form_for :picture, :html => { :multipart => true } do |form| %>
 <
label for="first_name">Имя:</label>
 <%= 
form.text_field :first_name %>
 <
label for="last_name">Фамилия:</label>
 <%= 
form.text_field :last_name %>
 <%= 
submit_tag "Залить" %>
<% 
end %> 

В чём же проблема? Помогите, пожалуйста.


Время: 09:17