Diferencias que voy encontrando entre los dos lenguajes y me llaman la atencion.
Juanjo Conti
@jjconti
File.open('proruby.jpg')
RUBY_VERSION
"2.1.2"
def que_es obj
obj ? "#{obj} es true" : "#{obj} es false"
end
que_es []
"[] es true"
que_es 1
"1 es true"
que_es false
"false es false"
s = "Cactus"
s[0] = 'KKKK'
s
"KKKKactus"
"hola".to_i
0
".5".to_f
0.5
" 1.5 - fffffff ".to_f
1.5
"..... 1.54 - fffffff ".to_f
0.0
a = []
a[4] = 1
a
[nil, nil, nil, nil, 1]
a[10]
arr = Array.new(3, {})
[{}, {}, {}]
arr[1][:a] = 1
arr
[{:a=>1}, {:a=>1}, {:a=>1}]
array = [1, 2, 3, 4, 100]
array * 2
[1, 2, 3, 4, 100, 1, 2, 3, 4, 100]
array * '|'
"1|2|3|4|100"
[1, [2,3], 4, [[[5]]]] * ','
"1,2,3,4,5"
h = {}
h[1] = "a"
h[2] = "b"
h[3] = "c"
h.delete(1)
h[1] = "A"
h.keys
[2, 3, 1]
a = []
h = {a => 2}
h.default = 'defecto'
a << 1
h
{[1]=>2}
h[a]
"defecto"
h.rehash
h[a]
2
A pesar de que son objetos mutables, al usarlos como claves, se realiza una copia de ellos y se freeza.
key = 'a'
hash = {key => 1}
{"a"=>1}
key.upcase!
"A"
hash
{"a"=>1}
key.object_id
70262201808180
hash.keys[0].object_id
70262201808140
{:a => 1, :b => 2}
{:a=>1, :b=>2}
{a: 1, b: 2}
{:a=>1, :b=>2}
:simbolo
:simbolo
:"Con espacios"
:"Con espacios"
"hola".object_id
70262217568780
"hola".object_id
70262213790460
:hola.object_id
1171208
:hola.object_id
1171208
(1..4).to_a
[1, 2, 3, 4]
(1...4).to_a
[1, 2, 3]
e = "a".."z"
e.to_enum.next.next
"b"
def llama_bloque
puts "inicio llama_bloque"
yield
puts "fin llama_bloque"
end
:llama_bloque
llama_bloque { puts "en el bloque" }
inicio llama_bloque en el bloque fin llama_bloque
def llama_bloque
puts "inicio llama_bloque"
yield 2
puts "fin llama_bloque"
end
:llama_bloque
llama_bloque { |x| puts "en el bloque #{x}" }
inicio llama_bloque en el bloque 2 fin llama_bloque
def masticar numeros
for x in numeros
yield x * 2
end
end
:masticar
masticar [1,2,3,4] { |y| y / 2 }
[1, 2, 3, 4]
"hola".chop
"hol"
"hola".chomp
"hola"
"hola\n".chomp
"hola"
[1, 2, 3].map {|x| x * 2}
[2, 4, 6]
[1, 2, 3].collect do |x|
n = 1 + 1
x * n
end
[2, 4, 6]
array = ['hola', 3, Object.new]
array.size
3
array.count
3
array.length
3
array[10] = 1
array
["hola", 3, #<Object:0x007fce632a56a0>, nil, nil, nil, nil, nil, nil, nil, 1]
[array.size, array.count, array.length]
[11, 11, 11]
[1.to_s, "5".to_i]
["1", 5]
"1".to_int
NoMethodError: undefined method `to_int' for "1":String (pry):95:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/backend.rb:28:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:110:in `execute_request' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:62:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:30:in `run_kernel' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:16:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/bin/iruby:6:in `<top (required)>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `load' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'
class MyInt
def to_int
0
end
end
[1, 2][MyInt.new]
1
['un', 'dos', 'tres'].map(&:upcase)
["UN", "DOS", "TRES"]
class Symbol
def to_proc
Proc.new {|x| x * 2}
end
end
['un', 'dos', 'tres'].map(&:upcase)
["unun", "dosdos", "trestres"]
La regla de estilo dice que se recomiendo usar llaves cuando el bloque es de una línea y do/end cuando es multilínea. Para la elección, también conviene saber que las llaves tienen alta presedencia mientras que do/end baja.
def come_bloques a
puts a
yield
end
:come_bloques
come_bloques 1 { puts 2}
SyntaxError: unexpected '{', expecting end-of-input come_bloques 1 { puts 2} ^
come_bloques(1) { puts 2}
1 2
come_bloques 1 do puts 2 end
1 2
Para saber que existe una variable, no necesita haber ejecutado su asginación. Alcanza con que el parser la haya visto.
q.nil?
NameError: undefined local variable or method `q' for main:Object (pry):117:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/backend.rb:28:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:110:in `execute_request' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:62:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:30:in `run_kernel' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:16:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/bin/iruby:6:in `<top (required)>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `load' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'
q = 1 if q.nil?
1
if false
f = 1
end
f.inspect
"nil"
def parametros a, b=a*2
[a, b]
end
parametros 10
[10, 20]
def ejemplo(a, *b, c)
puts [a, b, c]
end
ejemplo 1, 2, 3, 4, 5
[1, [2, 3, 4], 5]
a = 1 if true
1
Como if es también una expresión, lo siguiente es válido:
if true
puts "no no no no"
end if false
config = {
A1: 1,
B2: 2
}
{:A1=>1, :B2=>2}
A1 = 1,
B2 = 2
A1
[1, 2]
C1 = 'A'
C2 = 'B'
C1 + C2
"AB"
'A' +C2
"AB"
C1 +C2
NoMethodError: undefined method `+@' for "B":String (pry):148:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/backend.rb:28:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:110:in `execute_request' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/kernel.rb:62:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:30:in `run_kernel' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/lib/iruby/command.rb:16:in `run' /Users/juanjo/.rvm/gems/ruby-2.1.2/gems/iruby-0.1.13/bin/iruby:6:in `<top (required)>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `load' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/iruby:23:in `<main>' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval' /Users/juanjo/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'
El uso de paréntesis al llamar a métodos sirve no solo para aumentar la legibilidad del código sino también para ayudar al parser a tomar decisiones correctas en situaciones ambiguas.
Respuesta de Matthew Kerwin en ruby-talk.
def C(*args) [:C, *args]; end
C = 99
99
C +1
[:C, 1]
C + 1
100