Подтверждение типа параметра Ruby - PullRequest
4 голосов
/ 08 июня 2011

Исходя из Java-фона, я немного обеспокоен совершенно безвкусным отношением Ruby к параметрам своего метода. В то время как в Java я мог гарантировать, что параметр x был типом, необходимым для правильной работы метода, в Ruby у меня нет способа гарантировать, что x является целым числом, строкой или чем-то еще в этом отношении.

Пример: если бы я хотел написать метод absolute_value в Java, заголовок был бы что-то вроде

public static int absoluteValue(int x)

В Ruby это будет что-то вроде

def self.absolute_value(x)

В этом примере в коде Java я могу быть абсолютно уверен, что передаваемый параметр не является «С Днем Рождения!» но в коде Ruby я этого не знаю. Как предотвратить эту ситуацию в Ruby, чтобы код не зависал во время выполнения?

Ответы [ 5 ]

4 голосов
/ 08 июня 2011

Добро пожаловать в Руби, Квас. Надеюсь, вы научитесь любить печатать утку. Вы получаете уверенность в своем коде на Ruby, написав тесты, независимо от проверки типов и компиляции. Вы получаете скорость, гибкость и удобочитаемость, не определяя типы.

4 голосов
/ 08 июня 2011

Хех, добро пожаловать в Ruby. Я тоже работал в Java в некоторые прошлые годы, и я действительно любил Java в то время.

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

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

И если тип не проверяется при первом запуске вашей программы Ruby, он вполне может быть покрыт вашими тестами.

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

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

2 голосов
/ 08 июня 2011

Пойдем со мной, если хочешь жить.

a="String"
puts a.kind_of? Integer  # false
puts a.kind_of? String   # true

a=10
puts a.kind_of? Integer  # true
puts a.kind_of? String   # false
1 голос
/ 08 июня 2011

Ruby (почти?) Всегда интерпретируется, поэтому проверка типа, указанная в заголовке метода, в любом случае завершится сбоем.Поведение « duck typing » (где тип операции проверяет, имеет ли объект, на который выполняется действие, правильный метод) является частью идиомы Ruby, и вам не следует пытаться писать Java на Ruby.Научитесь писать код на Ruby.

0 голосов
/ 17 января 2012

Вы можете выполнить минимальный уровень тестирования методов, сохраняя при этом типизацию утки. Использовать пример из книги «Язык программирования ruby»

def +(other)
  raise TypeError, "Point-like argument expected" unless other.respond_to? :x and other.respond_to? :y
  Point.new(@x + other.x, @y + other.y)
end

Этот пример используется для реализации операции "+" в классе Point, который работает с (x, y) кординатами. Вместо того, чтобы делать other.is_a? (Точка) - они проверили реализованный метод, что мне кажется хорошим вариантом. Можно утверждать, что «другой» объект может иметь атрибуты x и y, означающие нечто иное, что, хотя правильный аргумент пропускает точку, которую я просто указываю на золотую середину. Мой подход также направлен на непосредственное добавление и сбой, если кто-то передает неправильный тип.

...