Это будет серия статей, сравнивающих 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 на самом деле не слишком отличаются, когда речь идет о типах данных и изменчивости. Если я что-то пропустил или что-то осталось неясным, пожалуйста, оставьте комментарий ниже.

Спасибо за чтение! Заботиться.