Это будет серия статей, сравнивающих Ruby и JavaScript для начинающих и программистов среднего уровня. Надеюсь, вы чему-то научитесь по пути!
Содержание
- Определение терминов
- Ruby против JavaScript как первого языка
- Типы данных
- Изменчивость
- Передача по ссылке против передачи по значению
И Ruby, и JavaScript — отличные языки для изучения новичком.
Некоторые термины, которые вам нужно знать, прежде чем мы начнем:
Переменная: указатель или имя, присвоенное определенному значению в памяти. Таким образом, это значение не нужно вводить заново каждый раз, когда оно используется.
full_name = 'Hermonie Granger'
Объект: структура данных, состоящая из пар ключ-значение. Ключи — это уникальный идентификатор некоторого значения.
headmaster = {name: 'Albus', age: 'over 100?'}
- имя и возраст являются ключами.
Классы:чертежи для любых объектов, созданных с использованием этого класса.
- Чертежи, как и любые созданные объекты, будут иметь указанные свойства и методы, продиктованные классом.
- объекты, созданные с помощью класса, называются экземплярами
# Ruby Class # # Defining a class class Wizard def initialize(name, house) @name = name @house = house end end # Creating an instance of Wizard (a Wizard Object) hermonie = Wizard.new('hermonie', 'gryffindor')
Класс Wizard
требует, чтобы все созданные экземпляры имели свойства name
и house
.
- Они указываются при создании экземпляра (с использованием
new
метода класса).
Об этом будет подробно рассказано в следующей статье. Это просто для того, чтобы вы были в курсе концепций.
Методы: повторно используемый код, который можно настроить с помощью переменных (также называемых функциями или процедурами).
# Ruby Code # Defining a method that shows a string (put string) def introduce(name) puts name end # Calling introduce and passing a string introduce('Draco') # => 'Draco'
//
предшествуют закомментированным строкам кода JavaScript (JS)
console.log
— это метод, используемый для вывода значений на консоль (JS).
#
предшествует строкам кода, которые выводятся в Ruby.
=>
называется хеш-ракетой и представляет собой то, что возвращается из строк кода.
(при использовании в комментариях Ruby)
Сравнение
Рубин
Ruby разработан с идеей, что программирование должно приносить удовольствие.
- Это объектно-ориентированный язык программирования, что означает, что код структурирован в объекты, и эти объекты взаимодействуют друг с другом. Это очень популярная форма программирования, позволяющая создавать организованный, разделенный на части и многократно используемый код.
- Его синтаксис ясен, легко читается и интуитивно понятен.
gets
получает ввод строки, puts
вводит строку, повторение действия простое (зацикливание).
10.times do |n| puts "number is " + n end
- 10 раз: ввести в цикл строку «число равно» с текущим числом.
Чему учат многих новичков в JavaScript:
for (var i = 0; i < 10; i++) { console.log(i) }
- Как только вы понимаете, что все это значит — все просто. Хотя поначалу это может показаться очень загадочным.
JavaScript
Язык Интернета по умолчанию и, согласно ежегодному опросу Stack Overflow за 2017 год, — самый популярный.
Опрос разработчиков Stack Overflow 2017
- Из-за его популярности существует множество бесплатных ресурсов для изучения JavaScript.
- В последние годы JavaScript стал более объектно-ориентированным, но на самом деле это язык, основанный на прототипах, который может создавать более простой и менее взаимозависимый код, чем ООП.
- Если вы не знаете, что это значит, не беспокойтесь — все придет со временем.
Я бы порекомендовал JavaScript для работы, но на самом деле вы тоже не ошибетесь, изучая его. Изучение фундаментальных концепций программирования важнее языка.
- Кроме того, чем больше языков вы выучите, тем лучшим программистом вы станете. Тем не менее, оставайтесь последовательным с одним и изучите его подробно, прежде чем переходить к другому. Многие рекомендуют изучать стек (LAMP, MEAN, MERN) или группу языков, если вы занимаетесь веб-разработкой.
Эта статья даст вам отправную точку для навигации по всем необходимым технологиям для серверной или клиентской части.
Дорожная карта веб-разработчиков на 2018 год — codeburst
Оставив это введение в стороне, давайте начнем с того, как данные хранятся на обоих языках.
Типы данных
Тип данных — это просто категория, которая сообщает компилятору (то, что превращает ваш код в машинный код), как интерпретировать данные.
- Ruby и JavaScript — это динамически типизированные языки. Это означает, что переменные не имеют явного типа и могут быть назначены и переназначены для любого типа значения.
- Тип данных переменной определяется тем, какой тип является текущим значением этой переменной.
В отличие от статически типизированных языков, где тип явно указывается для каждой переменной, и переназначение другого типа значения приводит к ошибке.
Далее — объявляется переменная и присваиваются и переназначаются данные разных типов
// Javascript // // String value var orphan = 'Harry' // Number value orphan = 11; // Object value orphan = {knownAs: 'The boy who lived', favoriteSport: 'quidditch'}; # Ruby # # String value dobby = 'house elf' # Hash value dobby = {'warning' => 'Harry Potter must not go back to hogwarts!'} # FalseClass value (Boolean) dobby = false
тип данных orphan
или dobby
не требует явного указания заранее и не устанавливается на постоянной основе после определения переменной
Оба языка гибки в том, какие значения могут быть присвоены переменным, но имеют ключевые различия в том, как сами значения хранятся в памяти компьютера.
В Ruby все является объектом, и каждый тип данных является экземпляром класса.
- Фрагмент данных называется объектом этого класса.
4
является объектомInteger
- Сами данные являются объектом (а не переменной)
В JavaScript — некоторые типы данных являются примитивами, а остальные — объектами.
Типы на обоих языках
- Нить
- Множество
- Символ
Ruby Типы
- НилКласс
- TrueClass
- Ложный класс
- Хэш
- Плавающая (числа с десятичной запятой)
- Целое (целые числа)
Типы JavaScript
Примитивы
- логический
- Нулевой
- Неопределенный
- Число (представляет как числа с плавающей запятой, так и целые числа)
Null и Undefined оба означают отсутствие значения. Тем не менее, Undefined не должен использоваться программистом — только движком JS. Вместо этого используйте Null.
Объекты
- Функции
- Карты
- Объект
Определение типа данных
Рубин
Object.class
'seeker'.class # => String {name: 'Ron'}.class # => Hash 9.75.class # => Float
JavaScript
typeof
console.log(typeof 9.75); // "number" console.log(typeof 'Expecto Patronum'); // "string" console.log(typeof true); // "boolean"
Изменчивость (способ хранения данных)
В JavaScript примитивные типы данных хранятся иначе, чем объектные типы данных.
В Ruby все является объектом, но некоторые типы данных по-прежнему хранятся не так, как другие.
Вы спросите, а зачем мне это знать?
При изменении или перемещении значений в вашей программе. Важно понимать, какие значения на самом деле копируются или изменяются
- Понимание того, как язык управляет информацией, поможет вам понять состояние вашей программы.
- Другими словами — данные и какие функции их изменяют
Каждое значение в программе имеет место в памяти
Если вам нужно более подробное объяснение и история концепций места и ценности в программировании, я настоятельно рекомендую этот доклад Рича Хики (создателя Clojure)
Значение в этом месте либо может быть обновлено, либо нет.
- изменяемоезначение — это значение, которое можно изменить.
- неизменяемое значение — это значение, которое нельзя изменить.
В Ruby единственные типы данных, которые являются неизменяемыми по умолчанию
- TrueClass, FalseClass, ноль
- Числовой
- Символ
В JavaScript только неизменяемые типы данных являются примитивами.
То, как эти значения копируются или передаются функциям, зависит от типа данных и от того, считается ли он неизменяемым.
Передача по ссылке и передача по значению
Копии по ссылке означают, что создается дополнительный указатель на то же место в памяти.
- Две переменные с одинаковым значением
Копии по значению означают, что создается дополнительный указатель с новым расположением в памяти.
- Две переменные с разными значениями
Рубин
В ruby
object_id
возвращает адрес памяти этого объекта
# Immutable values # # Copying a value by-reference horcruxes = 6 souls = horcruxes horcruxes.object_id == souls.object_id # => true lord_voldy = false tom_riddle = lord_voldy lord_voldy.object_id == tom_riddle.object_id # => true
В предыдущих примерах — есть только одно значение (типа Integer и FalseClass), а «копии» создаются путем создания еще одного указателя на это значение.
При копировании изменяемых значений в Ruby — поведение аналогично неизменяемым значениям
- Обе переменные указывают на одно и то же значение. Если значение изменено, но не переназначено, измененное значение отображается в обеих переменных.
# Creating a copy by-reference of a mutable value mother = 'Lily Evans' gryffindor = mother # Concat adds a string to the called string mother.concat(' - Potter') puts gryffindor # => 'Lily Evans - Potter' mother.object_id == gryffindor.object_id # => true
И mother
, и gryffindor
указывают на одну и ту же строку в памяти, поэтому изменение значения с использованием одной переменной влияет на оба.
Однако с переназначением
mother = 'Ginny Weasley' puts gryffindor # => 'Lily Evans - Potter' mother.object_id == gryffindor.object_id # => false
- Присвоение оригиналу нового значения создает новое значение в памяти, а копия продолжает указывать на исходное значение.
Передача в функцию
- Неизменяемые типы передаются по значению, а изменяемые типы передаются по ссылке.
- Это технически неверно. Похоже, Ruby ведет себя таким образом — для неизменяемых значений он фактически передает ссылочное значение. Это все, что вам нужно знать. Если вы хотите узнать больше — Launch School — отличный ресурс обо всем, что связано с Ruby.
- Передача объектов в Ruby — по ссылке или по значению?
# Mutable values # wandmaker = 'Garrick Ollivander' def add_house(name) # Is this a copy made only for the execution of this method? name.concat(' - Ravenclaw') puts name # memory address for name puts name.object_id end add_house(wandmaker) # Testing whether original value was changed puts wandmaker puts wandmaker.object_id end # Garrick Ollivander - Ravenclaw # 70349890968900 # Garrick Ollivander - Ravenclaw # 70349890968900
Значение для wandmaker
было постоянно изменено вне метода add_house
, а методы object_id показывают, что адрес памяти одинаков внутри и вне метода.
- Ruby для изменяемых значений передается по ссылке — создается дополнительный указатель на то же место в памяти. Это значение изменяется.
Однако для переназначения — поведение другое
tonks = 'nymphadora tonks' def new_capitalize(name) capital_name = name.capitalize puts capital_name puts capital_name.object_id end new_capitalize(tonks) puts tonks puts tonks.object_id # Nymphadora tonks # 70314315512820 # nymphadora tonks # 70314315512900
При переназначении — исходное значение остается прежним, а адреса памяти другими.
- Переназначение создает новое место в памяти. Модификация изменяет текущее место в памяти.
JavaScript
В JavaScript объекты изменяемы, а неизменяемы только примитивные типы.
Невозможно найти адрес памяти значения в JavaScript (который мне удалось найти), но для примитивов он выглядит как копирование по значению, а для объектов по ссылке
Копировать по значению — примитив
// String is a primitive and thus immutable let patronus_ron = 'Jack Russel Terrier'; // Creating a copy by-value let patronus_dog = patronus_ron; // Concatenating a string to the original patronus_ron += ' + Otter'; // Does not affect the copy console.log(patronus_dog) // 'Jack Russel Terrier'
Поскольку примитивные типы неизменяемы, попытка изменить значение создает новое место в памяти, а не изменяет оригинал.
Копировать по ссылке — объект
// Objects are mutable, copies are by-reference let severus = {lastName: 'Snape', proffesion: 'Potions Master'}; // Creating a 'copy' (additional pointer) let headmaster = severus; // Changing the original severus.patronus = 'doe'; // Mutates the copy console.log(headmaster); // {"lastName":"Snape","proffesion":"Potions Master","patronus":"doe"}
- Обе переменные являются указателями на один и тот же объект в памяти — изменение значения приводит к изменению всех ссылок.
Передача работает так же, как копирование
Примитив: по значению
// String type yearsInAzkaban = 12; function add(number) { number += 2; console.log(number); } add(yearsInAzkaban); // 14 console.log(yearsInAzkaban); // 12
Объект: по ссылке
let deathEater = {name: 'Bellatrix Lestrange'}; function addPureBlood(wizard) { wizard.bloodStatus = 'Pure'; console.log(wizard); } addPureBlood(deathEater); console.log(deathEater); // Both the orginal and copy point to the same value // {name:"Bellatrix Lestrange", bloodStatus:"Pure"}
Ruby и JavaScript на самом деле не слишком отличаются, когда речь идет о типах данных и изменчивости. Если я что-то пропустил или что-то осталось неясным, пожалуйста, оставьте комментарий ниже.
Спасибо за чтение! Заботиться.