Вопрос

Это потому, что я новичок, изучающий Ruby, или у него действительно больше способов писать (те же самые) вещи, чем на Java / C #?Кроме того, если он более гибкий, чем Java, существуют ли какие-либо лингвистические особенности Ruby, которые обычно нет используется, чтобы избежать путаницы?

Примерами могут быть параллельное присваивание и, возможно, все различные способы записи строк?

Примечание: Я не прошу сравнения с Java / C #...только этот языковой вопрос, пожалуйста...

Редактировать: Я понимаю, что C #, Java и Ruby строго типизированы, и что только Ruby (как Python и другие) динамически типизируется (в то время как Java / C # статически типизированы).В некоторых ответах говорится, что динамически типизированные языки более гибкие.Обязательно ли это так, и как это влияет на синтаксис? Я всего лишь спрашиваю о синтаксической гибкости.

(PHP также динамически типизируется, и это делает нет насколько я видел, кажется более гибким, чем Java / C #.Опять же, я имею в виду с точки зрения синтаксиса, а не с точки зрения развертывания или какого-либо другого аспекта ...)

Это было полезно?

Решение

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

Другие советы

Как по мне, наиболее часто используемые функции в Ruby и отсутствующие в Java - это блоки кода / лямбды / замыкания.

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

Другим динамическим языком, который довольно похож на Ruby, является Python.Однако, в Дзен питона, одно из правил гласит, что "должен быть один, и только один, способ сделать что-либо".Это полярная противоположность Ruby, который допускает так много метапрограммирования, что существует, по сути, бесконечное количество способов сделать одно и то же.

Тем не менее, это несколько иронично, что вплоть до Python 3.0 (он же:3000) значения string и unicode были разных типов.Хотя это имеет смысл, люди иногда сталкиваются с проблемами, когда им приходится часто конвертировать между ними для выполнения текстовых операций.

Если у вас есть выбор, я бы почти рекомендовал использовать Python в качестве введения в динамические языки.В Ruby нет ничего плохого, но вы можете обнаружить, что будете сталкиваться с меньшим количеством ситуаций, когда "правильный" способ сделать что-то не совсем очевиден.

В ответ на динамическую типизацию PHP:

Система типов PHP является гибкой, позволяя автоматически преобразовывать типы в зависимости от того, в каком контексте они используются.Однако на самом деле это не создает реальных динамических типов.Сам язык в основном статичен и не позволит вам добавлять атрибуты к объектам, например, во время выполнения (по крайней мере, в последний раз, когда я проверял).

Python и, вполне возможно, Ruby на самом деле строго типизированы, что означает, что вы можете уверенно выполнять сравнение типов и не можете выполнять трюки PHP, такие как добавление числовых строк для получения числа.Настоящие динамические языки также часто допускают метаклассификацию, где вы можете настроить тип экземпляра или класса или добавить атрибуты к любому из них - и все это во время выполнения.

Ruby - это динамичный язык.C # и Java являются статически типизированными языками со строгой типизацией.C # в версии 4.0 добавит динамические функции, но до сих пор Java и C # имели совершенно иную и более строгую парадигму, чем динамические языки, такие как Ruby и Python.

Я прокомментировал ответ rkj выше относительно lambda.Этот код демонстрирует пример, который вы просили;

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

Первый момент, на который следует обратить внимание, заключается в том, что fixed_point метод реализует общую идею постепенного применения процесса к некоторым данным до тех пор, пока он не пройдет определенный тест.Тот Самый sqrt функция определяет процесс нахождения квадратного корня и тест для определения того, когда мы должны быть удовлетворены.Затем эти "процедуры" передаются точно так же, как любая другая форма данных, так что fixed_point может сотворить это волшебство.

Вместо временного сохранения процесса и тестирования все это могло бы быть анонимным.Мы могли бы переписать sqrt как;

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

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

Конечно, еще один вариант, который предоставляет Ruby, - это метапрограммирование.Я мог бы переписать sqrt так что он переписывается (на лету) fixed_point используя правильный процесс и тест, но это, вероятно, злоупотребление функцией :-)

ps.Размещенная ссылка на JoelOnSoftware заслуживает повторения; http://www.joelonsoftware.com/items/2006/08/01.html

Все языки с динамической типизацией (например, Ruby) обычно более гибкие, чем языки со статической типизацией (например, Java).Вам не нужно бороться с системой типов, что вы часто делаете в статически типизированных языках.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top