ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[Ruby] - Задай вопрос, получи ответ
  #1  
Старый 24.08.2009, 12:21
Аватар для Sharky
Sharky
Познавший АНТИЧАТ
Регистрация: 01.05.2006
Сообщений: 1,021
Провел на форуме:
3424739

Репутация: 921


Отправить сообщение для Sharky с помощью ICQ
По умолчанию [Ruby] - Задай вопрос, получи ответ

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

  #2  
Старый 24.08.2009, 15:25
Аватар для Flcn
Flcn
Познающий
Регистрация: 06.07.2009
Сообщений: 54
Провел на форуме:
65872

Репутация: 17
Отправить сообщение для Flcn с помощью ICQ
По умолчанию

ок.
буду первым. недавно начал изучение. вопрос вызвал один код
Код:
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
то работать он перестаёт. при суммировании он возвращает тока первый элемент. думаю надо копать в сторону локальности переменных. но понять точно не могу. видимо у меня немного не правильное понимание работы блоков. Зарание благодарен
 
Ответить с цитированием

  #3  
Старый 24.08.2009, 23:47
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

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

  #4  
Старый 25.08.2009, 00:50
Аватар для Flcn
Flcn
Познающий
Регистрация: 06.07.2009
Сообщений: 54
Провел на форуме:
65872

Репутация: 17
Отправить сообщение для Flcn с помощью ICQ
По умолчанию

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

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

  #5  
Старый 25.08.2009, 01:01
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от 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;}
 
Ответить с цитированием

  #6  
Старый 25.08.2009, 14:30
Аватар для login999
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

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

  #7  
Старый 25.08.2009, 14:46
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

В Руби есть 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 }
 
Ответить с цитированием

  #8  
Старый 30.08.2009, 01:12
Аватар для Flcn
Flcn
Познающий
Регистрация: 06.07.2009
Сообщений: 54
Провел на форуме:
65872

Репутация: 17
Отправить сообщение для Flcn с помощью ICQ
По умолчанию

А что означает вот этот код?
Код:
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
 
Ответить с цитированием

  #9  
Старый 30.08.2009, 11:55
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

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

  #10  
Старый 04.09.2009, 17:46
Аватар для Flcn
Flcn
Познающий
Регистрация: 06.07.2009
Сообщений: 54
Провел на форуме:
65872

Репутация: 17
Отправить сообщение для Flcn с помощью ICQ
По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Wi-Fi, BT] Задай вопрос - получи ответ! Alexsize Беспроводные технологии/WPAN/WLAN 2564 06.04.2026 23:31
Задай вопрос - получи Ответ Thanat0z Расшифровка хешей 489 16.06.2010 17:34
[Flash, ActionScript] Задай вопрос, получи ответ mff PHP, PERL, MySQL, JavaScript 213 13.06.2010 11:17
WebServers (apache, nginx, lighttpd, iis) - Задай вопрос, получи ответ. Krist_ALL Администрирование 8 28.05.2010 20:56
ВКонтакте "счастливый фермер" ЖенькО Социальные сети 309 22.07.2009 11:35



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ