class A implements Fetcher {
getObject(done: IGetObjectCallback) {}
}
const a = new A
a.getObject((x: any, y: number) => {})
// TS2345: Argument of type '(x: any, y: number) => void' is not assignable to parameter of type 'IGetObjectCallback'.
Зачем сразу год. Можно начать с нескольких дней — и это вполне реально. Форк не получится сам по себе, если вдруг кто-то покажет длинную цепочку, которая ответвилась, скажем, год назад — все просто начнут майнить поверх нее. Конечно, используются чекпоинты, раньше которых переписать историю не получится, но они даже не ежемесячные.
Можно. Если они переведены от владельца этого хэшрэйта. У других майнеров можно забрать, и у тех, кому они перевели намайненые монеты. Все что нужно — начать майнить довольно старые блоки.
Уже даже привык к такому поведению аудитории на Хабре, но все-равно как-то вымораживает
…
Что это за приложения, которые необходимо написать быстро, причем выбирать для этого руби? Лично я на коленке леплю скрипты на PHP
А что вам на это отвечать? Выглядит как субъективное мнение без обоснований, за это минус. Кто-то точно так же напишет, что он на ноде эти задачи сделает, и не возьмет пхп. Пусть пишет, но это не к чему знать всем остальным.
Вы на руби писали? Много писали? В языке разобрались? Если да, то пишите по существу — чем он плох, почему вы вместо него выбираете пхп.
https://ruby-doc.org/core/Enumerable.html для примера. Если класс предоставляет метод each, то include Enumerable добавит filter, find, inject/reduce, .... Это не кто-то посторонний делает, а автор класса: метод include — private.
Еще я не точно выразился: не только модули покажет, но и суперклассы, и в каком какой метод определен.
Добавлю, что язык и его инструменты изучать во многом проще чем другие. Для того чтобы посмотреть код модуля/метода, список методов объекта и, какие из какого модуля добавлены, не нужно никаких IDE — есть библиотека pry, написанная на руби. Похожего для других языков я не встречал.
Логгер — абстрактный пример, пусть будет 1 инстанс на тред :) С contextmanager все ок получается.
contextmanager пробовал, забыл про него. Для меня это еще 1 минус языка — чтобы не добавлять многострочные лямбды, добавили сомнительную конструкцию языка и к ней костыль. Во мне негодует Оккам. Возвращать значения из with все равно нельзя вроде, поэтому мне этот способ не подошел в реальной ситуации.
Не очень понял какой будет ответ на мой вопрос
В руби тоже о читаемости заботятся, плохие хаки не одобряют. Хорошие применяют когда требуется и все это документируют.
Если "магия" — это просто нечто мощное, то почему нужно отказываться от этого, если кто-то этого не понимает. Когда я начинал писать на руби, для меня многое было удивительным, но под капотом все оказывалось очень простым. Для этого не обязательно читать исходники интерпретатора — все есть в документации и другом коде на руби. Многие руби программисты и через несколько лет не понимают, что на самом деле делает конструкция, которую они используют постоянно — им просто не интересно или не хочется разобраться. Для них это остается магией.
Вместо магии я вижу средства, которыми нужно уметь пользоваться, и понимать, когда их нужно использовать, а когда нужно обойтись без них.
Я видел много плохого руби кода, но никогда повсеместного неправильного применения метапрограммирования, оверрайдов и тд. Основные причины, почему он был плохим — люди, писавшие его:
не имели базовых знаний computer science,
пытались применять подходы из других языков,
просто не изучили или не поняли язык и инструменты.
Эти причины определены не языком, я видел такой код и в крупных проектах на других языках. Конечно, где таких программистов больше, там и вероятность встретить плохой код выше. Судя по всему, порог вхождения у руби ниже, и это является причиной.
в сообществе Питона больше заботятся о читаемости текста
Недавно делал несколько моделей для TensorFlow, в некоторых официальных примерах организация кода не очень удачно выполнена.
Касательно Python, по-моему, большое колличество особенных методов вида __len__ — это более магически. Даже их вид настораживает. При этом их необходимо использовать, чтобы пользоваться основными конструкциями языка. Мне особенно не нравится with с __enter__ и __exit__. Были бы многострочные лямбды, было бы лучше, наврное:
Заголовок спойлера
Дисклэймер! Я не гуру питона, может все не так надо делать :)
class Pool:
def __enter__(self):
# Нельзя передать аргументы :(
connection = self.checkout()
return connection
def __exit__(self, тут, какие-то, аргументы, еще, надо, знать):
if need_to_check_always:
self.checkin(one_of_args)
# return? неееет
value = None
with pool as connection:
prepare_something
value = connection.get('some')
vs
class Pool
def with(timeout)
connection = checkout(timeout: timeout)
begin
yield connection
ensure
checkin(connection)
end
end
end
value = pool.with do |connection|
prepare_something
connection.get('some')
end
А такое в питоне я знаю как сделать только, определяя локальную функцию, чтобы ее просто обернуть в лямбду:
class Logger
def with_level(new_level)
old_level = level
self.level = new_level
yield
ensure
self.level = old_level
flush
end
end
logger.with_level(:debug) do
something
more
end
logger.with_level(:error) do
again
and_again
end
Но это не претензии к языку, просто наблюдение. Каждый пишет на чем хочет.
$ man irb
...
-m Bc mode (load mathn, fraction or matrix are available)
# С других источников:
Sets bc mode [...]
See Command line options at IRB and the unix manpage bc(1) for more information.
$ man bc
bc - An arbitrary precision calculator language
Т.е. это модуль, который делает bc из руби. 100 строчек чтобы эмулировать в руби другой язык.
Почему он в stdlib? Мне кажется, он очень похож "private" модуль для такого режима, который никто не должен реквайрить в обычных приложениях. Но если очень хочется, то можно, как и private метод вызвать, только вся ответственность уже на разработчике, который это использует.
Библиотека для специфичной аудитории, видимо. Для тех, кому нужно решать математические задачи, не задумываясь о том, что у программистов есть какие-то там integer (3/2 = 1).
Без примеров мне сложно понять, что называют магией. Перегрузка операторов бывает полезна:
a = Money.new(1, 'usd')
b = Money.new(2, 'usd')
a + b
# не хуже, а может и лучше, чем
a.add(b)
# и, по мне, в разы лучше чем
import add from money.math
add(a, b)
не боги горшки обжигают, я тоже магию могу. В сообществе ценятся элегантные компактные решения и хитрые хаки
Я с таким не сталкивался, наверное, мне повезло. Если есть примеры, поделитесь, пожалуйста.
PS. Плохие программисты могут писать на разных языках. Может быть, по ним не надо оценивать язык.
PPS. Я изначально обратил внимание только на то, что другие языки с указанными особенностями получили меньше негатива. Т.е. это негатив — не от этих особенностей. Немного подробнее написал в другом комментарии: https://habrahabr.ru/post/341516/#comment_10503278
Я не пытаюсь сравнивать с с++, это просто пример, где метапрограммирование еще больше "уменьшает предсказуемость поведения просматриваемого в данный момент кода".
Если плохо пользоваться шаблонами с++, можно столкнуться с бОльшими трудностями. Метапрограммирование в том или ином виде есть в большинстве языков с меньшим количеством негативных оценок. В руби, благодаря модели наследования, можно получить гораздо более предсказуемое и отлаживаемое поведение. А из-за гибкого синтаксиса, самые разные DSL можно реализовать без библиотек, только с использованием языка.
Вы хотите, чтобы я за вас проверил?)
Пример с Fetcher тоже из этой документации. В статью почему-то не добавили совет и пример:
"… всегда можно передать коллбэк, который принимает меньшее число аргументов" будет правильнее.
Что-то не работает.
Официальные доки советуют использовать опциональные параметры вместо перегрузок: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html#use-optional-parameters
Посмотрите https://github.com/trailofbits/algo. Может быть, все что нужно будет — перевести ридми.
Зачем сразу год. Можно начать с нескольких дней — и это вполне реально. Форк не получится сам по себе, если вдруг кто-то покажет длинную цепочку, которая ответвилась, скажем, год назад — все просто начнут майнить поверх нее. Конечно, используются чекпоинты, раньше которых переписать историю не получится, но они даже не ежемесячные.
Можно. Если они переведены от владельца этого хэшрэйта. У других майнеров можно забрать, и у тех, кому они перевели намайненые монеты. Все что нужно — начать майнить довольно старые блоки.
В js сами начали: core-js
Специально не отвечал вечером, т.к. думал что с утра перечитаю эти фразы по-другому, как-будто вопрос с интересом написан. Но нет… :)
Извините, если я вправду неправильно её прочитал и все домыслил. Серьезно. Но на вопрос ответил уже.
Я выше тоже писал, чем хорош руби по-моему: https://habrahabr.ru/post/341516/#comment_10503278. Интересное обсуждение с несколькими хорошими примерами было в этой ветке: https://habrahabr.ru/post/341516/#comment_10509174.
По-мне, звучит как "нет таких приложений, для которых руби подошел лучше, чем рнр", не очень похоже на вопрос, заданный с интересом.
Если действительно интересно, то сначала изучите то, что хотите критиковать (например: http://guides.rubyonrails.org/, https://www.ruby-lang.org/en/documentation/quickstart/).
Касательно вашего вопроса: все, что вы перечислили, можно написать на руби.
А что вам на это отвечать? Выглядит как субъективное мнение без обоснований, за это минус. Кто-то точно так же напишет, что он на ноде эти задачи сделает, и не возьмет пхп. Пусть пишет, но это не к чему знать всем остальным.
Вы на руби писали? Много писали? В языке разобрались? Если да, то пишите по существу — чем он плох, почему вы вместо него выбираете пхп.
В ubuntu (про другие дистрибутивы не уверен) в пакете nginx сразу идет файл
/etc/nginx/proxy_params:С ним для каждого хоста достаточно
include proxy_params;https://ruby-doc.org/core/Enumerable.html для примера. Если класс предоставляет метод
each, тоinclude Enumerableдобавитfilter, find, inject/reduce, .... Это не кто-то посторонний делает, а автор класса: методinclude— private.Еще я не точно выразился: не только модули покажет, но и суперклассы, и в каком какой метод определен.
Добавлю, что язык и его инструменты изучать во многом проще чем другие. Для того чтобы посмотреть код модуля/метода, список методов объекта и, какие из какого модуля добавлены, не нужно никаких IDE — есть библиотека pry, написанная на руби. Похожего для других языков я не встречал.
Логгер — абстрактный пример, пусть будет 1 инстанс на тред :) С contextmanager все ок получается.
contextmanager пробовал, забыл про него. Для меня это еще 1 минус языка — чтобы не добавлять многострочные лямбды, добавили сомнительную конструкцию языка и к ней костыль. Во мне негодует Оккам. Возвращать значения из
withвсе равно нельзя вроде, поэтому мне этот способ не подошел в реальной ситуации.В руби тоже о читаемости заботятся, плохие хаки не одобряют. Хорошие применяют когда требуется и все это документируют.
Если "магия" — это просто нечто мощное, то почему нужно отказываться от этого, если кто-то этого не понимает. Когда я начинал писать на руби, для меня многое было удивительным, но под капотом все оказывалось очень простым. Для этого не обязательно читать исходники интерпретатора — все есть в документации и другом коде на руби. Многие руби программисты и через несколько лет не понимают, что на самом деле делает конструкция, которую они используют постоянно — им просто не интересно или не хочется разобраться. Для них это остается магией.
Вместо магии я вижу средства, которыми нужно уметь пользоваться, и понимать, когда их нужно использовать, а когда нужно обойтись без них.
¯\_(ツ)_/¯
Я видел много плохого руби кода, но никогда повсеместного неправильного применения метапрограммирования, оверрайдов и тд. Основные причины, почему он был плохим — люди, писавшие его:
Эти причины определены не языком, я видел такой код и в крупных проектах на других языках. Конечно, где таких программистов больше, там и вероятность встретить плохой код выше. Судя по всему, порог вхождения у руби ниже, и это является причиной.
Недавно делал несколько моделей для TensorFlow, в некоторых официальных примерах организация кода не очень удачно выполнена.
Касательно Python, по-моему, большое колличество особенных методов вида
__len__— это более магически. Даже их вид настораживает. При этом их необходимо использовать, чтобы пользоваться основными конструкциями языка. Мне особенно не нравитсяwithс__enter__и__exit__. Были бы многострочные лямбды, было бы лучше, наврное:Дисклэймер! Я не гуру питона, может все не так надо делать :)
vs
А такое в питоне я знаю как сделать только, определяя локальную функцию, чтобы ее просто обернуть в лямбду:
Но это не претензии к языку, просто наблюдение. Каждый пишет на чем хочет.
Т.е. это модуль, который делает bc из руби. 100 строчек чтобы эмулировать в руби другой язык.
Почему он в stdlib? Мне кажется, он очень похож "private" модуль для такого режима, который никто не должен реквайрить в обычных приложениях. Но если очень хочется, то можно, как и private метод вызвать, только вся ответственность уже на разработчике, который это использует.
https://github.com/ruby/mathn:
Вот пример из доки, тут лучше особенность показана:
Библиотека для специфичной аудитории, видимо. Для тех, кому нужно решать математические задачи, не задумываясь о том, что у программистов есть какие-то там integer (
3/2 = 1).Без примеров мне сложно понять, что называют магией. Перегрузка операторов бывает полезна:
Я с таким не сталкивался, наверное, мне повезло. Если есть примеры, поделитесь, пожалуйста.
PS. Плохие программисты могут писать на разных языках. Может быть, по ним не надо оценивать язык.
PPS. Я изначально обратил внимание только на то, что другие языки с указанными особенностями получили меньше негатива. Т.е. это негатив — не от этих особенностей. Немного подробнее написал в другом комментарии: https://habrahabr.ru/post/341516/#comment_10503278
Я не пытаюсь сравнивать с с++, это просто пример, где метапрограммирование еще больше "уменьшает предсказуемость поведения просматриваемого в данный момент кода".
Если плохо пользоваться шаблонами с++, можно столкнуться с бОльшими трудностями. Метапрограммирование в том или ином виде есть в большинстве языков с меньшим количеством негативных оценок. В руби, благодаря модели наследования, можно получить гораздо более предсказуемое и отлаживаемое поведение. А из-за гибкого синтаксиса, самые разные DSL можно реализовать без библиотек, только с использованием языка.