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

Форум АНТИЧАТ (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

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


Время: 14:39