Ruby para Swifteros

Al igual que swift ruby es un lenguaje orientado objetos robusto y con un amplio ecosistema en el desarrollo web. En esta guia encontraras los paradigmas y diferencias entre swift y ruby.

Principales Diferencias

  • Paradigma: Ruby es un lenguaje totalmente orientado a objetos, al contrario de swift donde tenemos structuras y enums que no son objetos. En ruby TODO es un objeto
  • Tipado: A diferencia de swift donde el tipado es estatico, en ruby el tipado es dinamico, lo cual quiere decir que nunca tendremos que definir un tipo de dato en una variable.
  • Interpretado: Al contrario de swift y objective-c donde se compila a un binario, ruby es un lenguaje interpretado, lo cual quiere decir que ruby interpreta linea por linea y ejecuta al vuelo. Por lo tanto si tenemos un error de en nuestro codigo no va haber un compilador que nos diga cual fue nuestro error. Los errores en ruby suceden en el momento de la ejecucion.

Variables

Swift

  let inmutableVariable: String = "Hello World!"
  var mutableVariable = "Hello"
  mutableVariable += " World!"

Ruby

  variable = "Hello"
  variable += " World!"

A diferencia de swift en ruby no hay “constantes”, todo puede cambiar.

Estructuras de Control

If

Swift

  if value {
    print("SI")
  } else {
    print("NO")
  }

Ruby

  if value
    puts("SI")
  else
    puts("NO")
  end

Como notaras la sintaxis del if es similar sin embargo en ruby se utilizan bloques de codigo con begin, do, end en ves de utilizar {}

Guard

Swift

  func foo(input: String?) -> String {
    guard let str = input else { return "NO" }
    return str
  }

Ruby

  def foo(input:)
    return "NO" unless input
    input
  end

Ruby de manera explicita no cuenta con un guard sin embargo el patron se puede implementar con unless que es un if !value

Switch

Swift

  switch value {
  case 1:
      print("one")
  case 2:
      print("two")
  default:
      print("other")
  }

Ruby

  case value
  when 1
    puts("one")
  when 2
    puts("two")
  else
    puts("other")
  end

En terminos de sintaxis es muy similar sin embargo las palabras reservadas cambian, en ruby usamos case en vez de switch y en vez de case usamos when esto porque ruby es un lenguaje que busca ser similar a una sintaxis en ingles.

Ciclos

Swift

  let items: [Int] = [1,2,3,4,5,6]
  for item in items {
    print(item)
  }

Ruby

  items = [1,2,3,4,5,6]
  items.each do |item|
    puts(item)
  end

Para iterar objetos, en ruby dado que todo es un objeto, los objeto enumerables cuentan con un metodo each para iterar sobre cada elemento.

Estructuras de Datos

Arrays

Swift

  let items: [String] = ["a", "b", "c", "d"]
  let items: [Any] = ["a", 1, 1.0, MyClass()]

Ruby

  items = ["a", "b", "c", "d"]
  values = [:a, 1, 1.0, MyClass.new(x)]

Dado que en ruby es de tipado dinamico, y todo es un objeto no es necesario definir un tipo de dato para los elementos de un Arrays

Dicionarios

Swift

  var items: [String:String] = ["a": "A", "b": "B"]
  items["c"] = "C"
  print(items["a"])

Ruby

  items = { "a" => "A", "b" => "B" }
  items["c"] = "C"
  puts(items["a"])

  items = { a: "A", b: "B" }
  items[:c] = "C"
  puts(items[:a])

En ruby los dicionarios son conocidos como hashmaps y se definen utilizando {} y mientras que en Swift las llaves las definimos con : en ruby usamos hash rocket =>, aunque generalmente en los hashmaps se definen con symbolos como llaves, por lo tanto la sintaxis queda mas reducida.

Clojures / Bloques

Swift

   func foo(bar: (Bool) -> Void) {
     bar(true)
   }

   foo() { value in
     print(value)
   }

Ruby

  def foo(block)
    block.call(true)
  end

  foo { |value| puts(value) }
  foo do |value|
    puts value
  end

Gran parte de elementos en ruby usan bloques que pueden ser procs o lambdas que si bien son muy similares tienen una similtud con los clojures de swift. La ventaja es que en ruby no se tiene que definir el tipo de dato.

Opcionales

Swift

  var value: String?

Ruby

  value = nil

Tanto en Objective-C como en swift todas las variables so No Opcionales, para permitir que un valor sea nulo Swift implemento opcionales, sin embargo el resto de lenguajes de programacion todas las varialbes pueden tener un puntero nulo.

Clases

Swift

  class MyClass: ParentClass {
    init(){

    }
  }

Ruby

  class MyClass < ParentClass
    def initialize
    end
  end