views:

517

answers:

4

In Ruby 1.8 and earlier,

Foo

is a constant (a Class, a Module, or another constant). Whereas

foo

is a variable. The key difference is as follows:

module Foo
  bar = 7
  BAZ = 8
end

Foo::BAZ
# => 8

Foo::bar
# NoMethodError: undefined method 'bar' for Foo:Module

That's all well and good, but Ruby 1.9 allows UTF-8 source code. So is "uppercase" or "lowecase" as far as this is concerned? What about (strict subset) or Ɖfoo?

Is there a general rule?

Later:

Ruby-core is already considering some of the mathematical operators. For example

module Kernel
  def √(num)
    ...
  end
  def ∑(*args)
    ...
  end
end

would allow

x = √2
y = ∑(1, 45, ...)

I would love to see

my_proc = λ { |...| ... }

x ∈ my_enumerable  # same as my_enumerable.include?(x)

my_infinite_range = (1..∞)

return 'foo' if x ≠ y

2.21 ≈ 2.2
A: 

I don't know what ruby would do if you used extended UTF8 characters as identifiers in your source code, but I know what I would do, which would be to slap you upside the back of the head and tell you DON'T DO THAT

Orion Edwards
Typo: tell => yell ;-)
webmat
+2  A: 

OK, my joking answer didn't go down so well.

This mailing list question, with answer from Matz indicates that Ruby 1.9's built in String#upcase and String#downcase methods will only handle ASCII characters.

Without testing it myself, I would see this as strong evidence that all non-ascii characters in source code will likely be considered lowercase.

Can someone download and compile the latest 1.9 and see?

Orion Edwards
+1  A: 

I would love to see

my_proc = λ { |...| ... }

x ∈ my_enumerable  # same as my_enumerable.include?(x)

my_infinite_range = (1..∞)

return 'foo' if x ≠ y

2.21 ≈ 2.2

I would love to see someone trying to type that program on an English keyboard :P

Julio César
Your apprehension is definitely warranted, but I'd gladly build Textmate macros to turn memberof + tab into ∈. The typing isn't any shorter than include?, but I think the code says what I mean more clearly. I'm sure it's a taste issue; I just really liked my discrete math classes in college.
James A. Rosen
A: 

I can't get IRB to accept UTF-8 characters, so I used a test script (/tmp/utf_test.rb).

"λ" works fine as a variable name:

# encoding: UTF-8
λ = 'foo'
puts λ

# from the command line:
> ruby -KU /tmp/utf_test.rb
foo

"λ" also works fine as a method name:

# encoding: UTF-8
Kernel.class_eval do
  alias_method :λ, :lambda
end

(λ { puts 'hi' }).call

# from the command line:
> ruby -KU /tmp/utf_test.rb:
hi

It doesn't work as a constant, though:

# encoding: UTF-8
Object.const_set :λ, 'bar'

# from the command line:
> ruby -KU /tmp/utf_test.rb:
utf_test.rb:2:in `const_set': wrong constant name λ (NameError)

Nor does the capitalized version:

# encoding: UTF-8
Object.const_set :Λ, 'bar'

# from the command line:
> ruby -KU /tmp/utf_test.rb:
utf_test.rb:2:in `const_set': wrong constant name Λ (NameError)

My suspicion is that constant names must start with a capital ASCII letter (must match /^[A-Z]/).

James A. Rosen