LINUX.ORG.RU

Ruby прекрасен

 , , ,


1

6

Раньше на скриптоте вообще не писал (питон всегда отпугивал своим видом, а эру расцвета перла я пропустил), а тут попалась книжка по руби и я прям влюбился. Ну это ж чудо, а не язык. Он точно не умрет в близком будущем (с загибанием рельсов), имеет смысл его не спеша постигать?

★★★

Ответ на: комментарий от user_id_68054

но всё же интересно узнать как подгружать модли *стандартными* срадетсвами так, чтобы это было как можно более явно

Что неявного с require? Да они подгружаются в глобальную область видимости но у каждого модуля свое название, там случайно ничего не вызвать.

TDrive ★★★★★
()
Ответ на: комментарий от Deleted

Это логичный ход. Python в нашем мире, это basic лет 15-20 назад. Нет смысла использовать для обучения студентов ЯП, который в реальном мире нигде не используется. А Python довольно популярен, поэтому время потраченное на изучения данного ЯП во время учёбы не будет потрачено зря, студенты потом смогут использовать Python на своей работе. Думаю, со временем Python тоже на что-то заменят. Может на Go? Go как раз имеет все шансы попасть в мейнстрим.

lucentcode ★★★★★
()
Ответ на: комментарий от TDrive

Что неявного с require

смотри :) — в общем случае — проблема такая:

1. допустим у меня есть некоторое количество модуль-файлов (внутри них — свои сложные зависимости связанные с другими модуль-файлами).

2. я подгружаю парочку из этих модуль-файлов (require).

3. затем я обращаюсь к некоторым функциям!

я обращаюсь к функциям свободно, так как дкмаю будто бы всё что нужно — у меня уже ранее импортировано (require).

4. в конечном счёте программа напсиана и работает!

*** затем проходит какое-то время. ***

выходит новая версия модуль-файлов, которые я использовал. а внутри них — поисходит некоторое изменение их сложных взаимозависимостей.

допустим что API-функций остаётся такой же (не менялся). и следовало бы полагать что всё также как и дальше должно работать..

НО(!), но оказывается что часть функций которые я вызывал — уже НЕ импортированы (требуются дополнительные require, которые я ранее не указал).

**********

вопрос: почему я ранее не указывал эти require? почему я такой глупый дурак? :)

ответ: потому что всё работало нормально, и я даже не знал что в новой версии это перестанет работать (будет требовать дополнительный require) :-)

**********

вывод из проблемы:

как узнать что если я вызываю какую-то функцию — то значит я *ТОЧНО* я импортировал её модуль-файл? (делал require.. и именно Я!)!

функция может прекрасно работать, даже если я забыл импортировать её модуль-файл (и это очень плохо!), в случае если соответвующий модуль-файл испортировал какой-то другой модуль-файл :-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 8)

Особое удовольствие — из-за динамизма куча ошибок вылезает на этапе запуска, а потому запуск дебагера становится обыденным занятием. Но все же язык красивый, не укуренный, как питон или перл.

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 2)
Ответ на: комментарий от user_id_68054
module A
  extend self

  def a1
    puts 'a1'
  end
end
require './a.rb'

module B
  extend self
  extend A

  def b1
    puts 'b1'
  end

  def b2
    a1
  end
end
#!/usr/bin/env ruby

require './b.rb'

B.b1 # b1
B.b2 # a1
A.a1 # a1 явно говорим что используем модуль A, не подключили - ССЗБ
a1 #undefined local variable or method `a1' for main:Object (NameError)
TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)

Увидеть Питон и не полюбить его всем сердцем может только бесчувственный кретин.

Deleted
()
Ответ на: комментарий от user_id_68054

Вообще это сказочная ситуация с кучей модулей которые сами подключают друг друга.
На практике пишут gem в зависимостях указывают необходимые для работы гемы, все эти зависимости вычисляются и подключаются за один раз.
Там кстати даже можно для гема указывать ветку гит репозитория и конкретный коммит что бы избежать нежелательных или непредвиденных обновлений.

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

A.a1 # a1 явно говорим что используем модуль A, не подключили - ССЗБ
a1 #undefined local variable or method `a1' for main:Object (NameError)

тыг ведь это практически такая же ситуация как с Python — вполне явное импортирование...

(что — хорошо :))

или есть какая-то разница, сравнивая с Python?

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

или есть какая-то разница, сравнивая с Python?

откуда я знаю), из твоего начального поста я пришел к выводу что в питоне даже A.a1 не будет доступно если явно не импортировать.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

а.. погодь.. да.. я осмотрелся..

A.a1 # a1 явно говорим что используем модуль A, не подключили - ССЗБ

тут ведь нет ни какой ошибки?

значит это не как в Python..

ну ладно.. думаю суть я понял.. врядли можно что-то ещё придумать тут в ruby :-)

если только рассмотреть идею — по временному переименованию модуля (сразу при импорте) и обращаться к нему по временному импорту...

но не уверен что такой изврат приведёт к чемуто полезному на практике

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Ответ на: комментарий от user_id_68054

но не уверен что такой изврат приведёт к чемуто полезному на практике

Я вообще не уверен что тут требуется какой либо изврат.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Я вообще не уверен что тут требуется какой либо изврат.

да.. если уж нельзя подключать зависимости в явном виде и при этом по мере необходимости...

...то действительно — уж лучше подключить всё это в некоторой «внешне» форме. как ты написал тут:

На практике пишут gem в зависимостях указывают необходимые для работы гемы, все эти зависимости вычисляются и подключаются за один раз.

user_id_68054 ★★★★★
()
Ответ на: комментарий от lucentcode

Ну переписывать клиент было бы грустно и технически и с тз бизнеса, а вот было бы оно на Ruby если бы они начали писать его сейчас - это вопрос. Папет тоже кстате большой любитель не уместиться в гигабайтах рам и очень медленно работать.

zz ★★★★
()
Ответ на: комментарий от zz

А, отстал от жизни, папет тоже выкинул руби на сервере.

zz ★★★★
()
Ответ на: комментарий от lucentcode

У go никаких шансов попасть в мейнстрим, кмк. Скорее уж JS, но питон гораздо лучше как язык для обучения.

zz ★★★★
()
Ответ на: комментарий от user_id_68054

да.. если уж нельзя подключать зависимости в явном виде и при этом по мере необходимости...

Можно но в глобальную область видимости, можно накостылять подключение в локальную область но практика показывает что оно нафиг никому не нужно.

TDrive ★★★★★
()
Ответ на: комментарий от erzent

Это, конечно хорошо. Но на ситуацию в целом это не повлияет. В настоящее время сайты на рельсе - капля в море, по сравнению с количеством сайтов на PHP. И популярность решений на PHP только растёт.

lucentcode ★★★★★
()
Ответ на: комментарий от zz

Если бы для клиентской части использовали компилируемый ЯП, пришлось бы для файлов рецептов создавать свой формат. Скорее всего на базе самопального DSL. Или прикручивать perl, python, ruby или lua к своему решению, что-бы не изобретать своё решение.

lucentcode ★★★★★
()
Ответ на: комментарий от zz

Жаль. Go хорош. Кстати, JS не так уж плох для обучения. Я бы даже сказал, весьма неплох. Он довольно простой, и занимает промежуточное положение межу языками командной оболочки и скриптовыми ЯП общего назначения, такими как Python. Думаю, новички, если им дать выбор, предпочтут JS.

lucentcode ★★★★★
()
Ответ на: комментарий от lucentcode

Кстати, JS не так уж плох для обучения.

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

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Думаю, асинхронность не сильно влияет на кривую обучения. Что касается прототипной ориентации, то в Lua(довольно простом для изучения ЯП) она так-же используется.

lucentcode ★★★★★
()
Ответ на: комментарий от erzent

в большинстве контор изначально сисадмин выбирает язык и

)))))))))))))))

Debasher ★★★★★
()
Ответ на: комментарий от lucentcode

Думаю, асинхронность не сильно влияет на кривую обучения.

Думаю влияет, так как когда с ней сталкиваешься надо научить человека думать в 4 измерениях а это + к порогу вхождения.

TDrive ★★★★★
()
Ответ на: комментарий от lucentcode

Если добавить типизирование и/или нормальные трейсбеки - почему бы и да. Но если учить не студентов, а жену - я бы взял питон.

zz ★★★★
()
Ответ на: комментарий от zz

На пыхе я пишу в личное время. А на работе таки питон :3

Kilte ★★★★★
()
Ответ на: комментарий от erzent

В большинстве контор, с которыми работал erzent может и так.

pylin ★★★★★
()

руби ето perl в юбке и накрашеный как гомосек, и без библиотек

anonymous
()
Ответ на: комментарий от TDrive

Совершенно верно. Иногда забываешь о том, что некоторые очевидные вещи для новичка могут быть не очевидными. Асинхронность как раз из числа таких вещей:)

lucentcode ★★★★★
()
Ответ на: комментарий от zz

Пожалуй, python на начальных этапах обучения неплох. Обучение людей далёких от IT программированию пожалуй стоит начинать с него. А для тех, у кого уже есть базовые навыки - JS вполне неплох.

lucentcode ★★★★★
()

Автор прав: Ruby - прекрасный язык.

Во-первых, сам язык прекрасен.
Во-вторых, классы и библиотеки шикарно организованы (в отличие от, например, питона).

Но все эти холивары «какой язык лучше» не нужны,
ибо любой язык учится за 2 недели
- а вот дальнейшее овладевание библиотеками потребует месяцы и годы.

Так что язык, по большому счёту, не важен - УЧИТЕ БИБЛИОТЕКИ, школота.

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

ибо любой язык учится за 2 недели

Синтаксис - да. Best practices и умение писать идиоматически и использовать специфичные паттерны - только в процессе работы над реальным кодом и изучения чужого кода. И это не две недели.

а вот дальнейшее овладевание библиотеками потребует месяцы и годы.

Это верно.

ovk48 ★★★
() автор топика
Последнее исправление: ovk48 (всего исправлений: 1)
Ответ на: комментарий от Novator

ибо любой язык учится за 2 недели

...если он однотипен тем что знал раньше

Debasher ★★★★★
()
Ответ на: комментарий от Novator

УЧИТЕ БИБЛИОТЕКИ

учите и изобретайте подходы

Debasher ★★★★★
()
Ответ на: комментарий от Novator

Во-первых, сам язык прекрасен.

Любитель попусту тратить время на разбор убогого синтаксиса?

Во-вторых, классы и библиотеки шикарно организованы (в отличие от, например, питона).

Покажи пример что по твоему значит «шикарно организованы» и чем это лучше того же питона?

Siado ★★★★★
()
Ответ на: комментарий от Novator

", - раздался кукарек со стороны жавапараши.

Deleted
()
Ответ на: комментарий от Siado

Любитель попусту тратить время на разбор убогого синтаксиса?

не питонщикам про убогий синтаксис тут заикаться

Debasher ★★★★★
()
Ответ на: комментарий от Siado

чем это лучше того же питона?

Я конечно не профессионал, но мне понадобилось один раз поправить кое-что в одном плагине к Sublime Text, и там нужно было сделать отсортированный список строк, не трогая первоначальный. Чесал репу полчаса, пока не добрался до правильного мануала (https://wiki.python.org/moin/HowTo/Sorting) и не понял истинное положение дел:

Python lists have a built-in sort() method that modifies the list in-place and a sorted() built-in function that builds a new sorted list from an iterable.

Т.е. деструктивная сортировка делается логично названным методом sort, определенном на списке, а функциональная - просто болтающейся хз где функцией, о которой нужно было еще догадаться, что она называется sorted. Это ли не п..ц?

ovk48 ★★★
() автор топика

Налы в треде. Зачем гибу если есть православная сисечка?

anonymous
()
Ответ на: комментарий от ovk48

болтающейся хз где функцией, о которой нужно было еще догадаться, что она называется sorted. Это ли не п..ц?

Она не болтается хз где, а описана на самой первой странице документации по python. Одна из 76 built-in функций. И применяется не только к спискам. Все логично.

Где пример как оно «шикарно организованно» в твоем раби?

Siado ★★★★★
()
Ответ на: комментарий от Siado

Покажи мне хотя бы один какой-нибудь читаемый проект

Читаемый для кого? Для тебя? ты врядли прочитаешь

на твоем раби

Он не мой, и я его не люблю, но блин говорить что питон читабельнее руби это конечно лол

Debasher ★★★★★
()
Ответ на: комментарий от Siado

язык должен быть читаемым в первую очередь для тех кто его изучил и использует. Тех, кто с этим не согласен - прошу проследовать в 1С мирок, там вполне читаемые СФОРМИРОВАТЬ_ОТЧЁТ и СДЕЛАТЬ_ДОКУМЕНТ

Debasher ★★★★★
()
Ответ на: комментарий от Siado

Одна из 76 built-in функций.

Из 76-ти? Я бы на твоем месте никому это число не называл, чтобы не позорить любимый ЯП.

Где пример как оно «шикарно организованно» в твоем раби?

l = [5, 3, 2, 4, 1]
p l.sort
p l
p l.sort!
p l
[1, 2, 3, 4, 5]
[5, 3, 2, 4, 1]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

При этом sort() определен не в Array, а в миксине Enumerable.

ovk48 ★★★
() автор топика
Ответ на: комментарий от ovk48

Лучший пример. А теперь скажи что делают методы с bang! в ActiveRecord, и как я должен угадывать зачем он там в каком то еще коде.

zz ★★★★
()
Ответ на: комментарий от ovk48

Ссылка на sorted есть в документации list.sort, я понимаю что с такой помойкой в референсах как в руби не привычно ими пользоваться, но тем не менее.

zz ★★★★
()
Ответ на: комментарий от zz

что делают методы с bang! в ActiveRecord

Не нашел такого класса в стандартной библиотеке.

Ссылка на sorted есть в документации list.sort

Офигенный аргумент. Ну ладно, а хотя бы почему sorted нету в list?

ovk48 ★★★
() автор топика
Ответ на: комментарий от ovk48

Потому что он там не нужен, он работает не только со списками.

zz ★★★★
()
Ответ на: комментарий от ovk48

Не нашел такого класса в стандартной библиотеке.

Я маловато видел кода где только стандартная библиотека.

zz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.