Равенство структур данных: Ruby против JavaScript

Равенство структур данных: Ruby против JavaScript

Coding


Равенство структур данных в Ruby

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

> first_array, second_array = [1,2,3], [1,2,3]

> first_array == second_array
=> true

Если по какой-то причине вы действительно хотите проверить и увидеть, что две переменные ссылаются на один и тот же объект, вы можете проверить идентификатор объекта или, предпочтительно, использовать .equal?метод:

> first_array, second_array = [1,2,3], [1,2,3]

> first_array.object_id == second_array.object_id # 70176467875700 == 70176467875680
=> false
> first_array.equal?(second_array) # a clearer way to perform this comparison
=> false

В отличие от JavaScript, оператор сравнения в Ruby на самом деле является методом, определенным в классе, который вы сравниваете (потрясающее прохождение этой концепции здесь ). 

Так как ==это всего лишь метод, вы можете даже переопределить его, если хотите! Это разумная практика, если вы пишете пользовательские классы, которые нужно сравнивать друг с другом. Глупый пример ниже:

> class Ditto
*   def self.==(other)
*     true
*   end
* end

> Ditto == 'Pikachu'
=> true
> Ditto == 2
=> true
> Ditto == false
=> true
Пиксельная версия логотипа JavaScript


Равенство структур данных в JavaScript

В отличие от Ruby, JavaScript не предоставляет уникальный идентификатор для объектов, потому что в этом нет необходимости . Структуры данных сравниваются по идентичности по умолчанию. Если две переменные равны, вы можете быть уверены, что они указывают на один и тот же объект в памяти.

> const firstArray = [1,2,3]
> const secondArray = [1,2,3]
> firstArray === secondArray
false

Если вы хотите проверить и увидеть, имеют ли две отдельные структуры данных одинаковое содержимое, вам придется написать собственную логику для проверки - или использовать функцию из библиотеки, например, Lodash .

// Super naïve implementation:
const arraysAreEqual = (array1, array2) => {
  return array1.every((el, index) => el === array2[index])
}
> arraysAreEqual([1,2,3],[1,2,3])
true
> arraysAreEqual([1,2,3],['a','b','c'])
false

TL; DR

JavaScript=== проверяет, равны ли по значению две вещи, которые он сравнивает, в то время как== метод Ruby проверяет, является ли содержимое двух массивов или хэшей эквивалентным.

Ruby против JS Equality - первое изображение двух закрытых коробок и логотип JavaScript, текст «Это одна и та же коробка?» Второе изображение двух открытых коробок с номерами 1, 2 и 3 в каждом тексте: «В этой коробке одинаковые вещи?»


Руби [1,2,3] == [1,2,3]переводится как [1,2,3].every((el, index) => el === [1,2,3][index])в JS.

JavaScript [1,2,3] === [1,2,3]переводится [1,2,3].equal?([1,2,3])в Ruby.

Рекомендации

Надеюсь, это поможет вам понять, чего ожидают два разных языка при сравнении структур данных! Если вам интересно углубиться, я собрал несколько ссылок:

Источник(English)

Заметили ошибку или есть вопросы?Рассказывай нам о них,связаться с нами ты сможешь с помощью нашего чата или же с помощью бота обратной связь


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


Report Page