Что делает Ruby Изящным Языком? [закрытый]

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

Вы устанавливаете пользовательский фильтр в django, который заставляет ключ Вашего dict в качестве параметра

заставлять его работать в механизме приложения Google, необходимо добавить файл к основному каталогу, я назвал мой django_hack.py, который содержит этот маленький кусочек кода

from google.appengine.ext import webapp

register = webapp.template.create_template_register()

def hash(h,key):
    if key in h:
        return h[key]
    else:
        return None

register.filter(hash)

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

webapp.template.register_template_library('django_hack')

и в шаблонном представлении добавляет, что этот шаблон вместо обычного кода

{{ user|hash:item }}

И должен работать отлично =)

12
задан Carl Smotricz 28 November 2009 в 12:21
поделиться

8 ответов

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

Простой пример: + для целых чисел добавляет их; для чисел с плавающей запятой, то же самое. И на больших целых числах тоже. В строках он объединяет их (чего и следовало ожидать). Теперь это не проблема для + , этого можно ожидать от любого достойного языка программирования. Но есть такие операции, как map или filter , они работают со списками (должны!), Но они также работают с массивами и фактически со всем, что можно перечислить или повторить.

Мне нравится, как работает индексация массива (или списка), вы можете использовать положительные целочисленные индексы для индексации с самого начала, или отрицательные индексы, чтобы указать позицию назад от конца структуры, вы можете указать диапазон для извлечения подмножества ... это также работает для списков, массивов и (под) строк. Он работает с правой стороны присваивания ( = ), он работает и с левой стороны (вы можете назначить подстроку, таким образом заменяя часть строки). Таким образом, вам не нужна функция substring_replace , вы просто используете существующую общую концепцию.

Автор Ruby выразил это в терминах удовлетворения ожиданий пользователя (то есть программиста): Должно быть как можно меньше сюрпризов, всякий раз, когда здравый смысл заставляет вас ожидать, что что-то работает определенным образом, так и должно быть. Он очень много работал, чтобы удовлетворить это требование. Кроме того, хотя Ruby немного позаимствовал у Perl, автор не согласен с принципом Perl TMTOWTDI в пользу Zen of Python: «Должен быть один - и желательно только один - очевидный способ сделать это».

Также приятно, что Ruby делает замыкания ( = блоки кода), поэтому вы можете указать функцию, просто заключив ее в фигурные скобки. Есть места, где уместно указывать встроенную функцию, и Ruby позволяет вам делать это удобно.

Ruby позволяет вам делать что-то с небольшим объемом кода, потому что его конструкции очень хорошо сочетаются друг с другом. Я пробуюсь в Project Euler и обнаружил, что часто самые короткие разборчивые и понятные решения были сделаны на Ruby. Самые короткие - на J, но это диалект APL, и для непосвященных он выглядит как линейный шум.

Мой личный опыт подтверждает это: Я изучил Ruby и Rails и написал веб-приложение со средним и сложным анализом данных за одну неделю. Каждый принцип, который я усвоил, я мог применить в разных местах с разными данными - It Just Works ™!

17
ответ дан 2 December 2019 в 03:54
поделиться
  • с открытыми классами , т.е. вы можете добавлять методы к классам после того, как они определены
  • , имея method_missing , то есть возможность обработки случаев, когда вы отправляем сообщение, для которого вы не определили метод. Опять же, это позволяет вам писать код, который адаптируется, а не просто дает сбой.
  • имея подобную Smalltalk, согласованную объектно-ориентированную модель , например, вы можете делать такие вещи, как 1. класс 1. раз {}. Это делает возможной большую часть поддержки DSL.
  • он имеет блоков / замыканий - значительно упрощает написание гибкого кода
  • он не тратит ваше время на статическую типизацию каждой переменной (т.е. попытка решить проблемы, которые не важны, если вы выполняете TDD)
  • Вам не нужно использовать объектно-ориентированный объект на основе классов, т.е. он поддерживает объектно-ориентированное программирование на основе прототипов
5
ответ дан 2 December 2019 в 03:54
поделиться

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

arr = ["one", "two", "three"]
arr.each { |e|
    puts e
}

Однако я считаю, что это нечто большее, элегантность языка Ruby также исходит от библиотек. Большинство библиотек продолжают использовать уникальный Ruby «стиль» для имен функций, такой как «each» для итераций или использование «!». а также '?' в конце имен функций для деструктивных / логических возвращаемых функций это то, что действительно делает Ruby «элегантным».

5
ответ дан 2 December 2019 в 03:54
поделиться

Ruby и DSL обсуждались а много .

Пример из sinatra :

get '/' do
    'Hello world!'
end

Или из этого блога :

ChessGame.new do |move|
  move.black_pawn(forward)
  move.white_pawn(forward)
  #…
  move.white_queen(pwn_king)
end
4
ответ дан 2 December 2019 в 03:54
поделиться

Я не могу утверждать, что это элегантно, я думаю, что в целом элегантность определяется реализацией программиста. Однако я могу утверждать, что он краток, и я думаю, что многие люди действительно чувствуют это, когда говорят, что Ruby элегантен. Часто код, который быстро собирается, кажется элегантным.

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

2
ответ дан 2 December 2019 в 03:54
поделиться

Поскольку ваши div position: absolute , они на самом деле не вложены в позицию. На вашей странице jsbin я изменил порядок div в HTML на:

<div class="child"><div class="parent"></div></div>

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

  • У него очень крутое и поддерживающее сообщество: вы найдете поддержку и помощь, в чем бы ни заключалась ваша проблема. Это сообщество поддерживает современные и модные методы кодирования, такие как TDD и BDD .
  • Сумма всего вышесказанного такова, что с помощью Ruby вы можете получить:

    • Краткий код: По сравнению с Java и C ++, по крайней мере, вы можете сэкономить 50% ввода кода.
    • Читабельность.

    Таким образом, имея читаемый и краткий код -> меньше кода для написания -> меньше кода для тестирования и поддержки -> Производительность .

    Я не должен забывать упомянуть великое поддерживающее сообщество, стоящее за Ruby.

    4
    ответ дан 2 December 2019 в 03:54
    поделиться

    Просто забавное примечание: это похоже на php , но это Ruby (с сегодняшнего дня), но первый ответ кажется элегантным Ruby. В PHP я закончил тем, что написал глупый длинный код, вроде связанного сообщения, чтобы делать мелочи. Отчасти потому, что лямбды практически не существуют. Поэтому я должен сказать, что поддержка лямбда Ruby вместе с map / reduce - вот что делает его элегантным для меня.

    но первый ответ кажется элегантным Ruby. В PHP я закончил тем, что написал глупый длинный код, вроде связанного сообщения, чтобы делать мелочи. Отчасти потому, что лямбды практически не существуют. Поэтому я должен сказать, что поддержка лямбда Ruby вместе с map / reduce - вот что делает его элегантным для меня.

    но первый ответ кажется элегантным Ruby. В PHP я закончил тем, что написал глупый длинный код, вроде связанного сообщения, чтобы делать мелочи. Отчасти потому, что лямбды практически не существуют. Поэтому я должен сказать, что поддержка лямбда-выражения Ruby вместе с map / reduce - вот что делает его элегантным для меня.

    0
    ответ дан 2 December 2019 в 03:54
    поделиться

    все является объектом (пс. Как в smalltalk ..):

    3.times { p "olleh" }
    

    расширяемые / открытые классы (например, из Rails):

    10.days_ago
    

    .. и другие на ruby ​​elegance : http://www.benhughes.name/files/presentations/ruby_elegance.pdf

    1
    ответ дан 2 December 2019 в 03:54
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: