2008-08-22 31 views
5

Trong Ruby 1.8 trở về trước,Ruby 1.9 xử lý các trường hợp ký tự trong mã nguồn như thế nào?

Foo 

là một hằng số (một Class, một mô-đun, hoặc liên tục khác). Trong khi đó,

foo 

là một biến. Sự khác biệt chính là như sau:

module Foo 
    bar = 7 
    BAZ = 8 
end 

Foo::BAZ 
# => 8 

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

Đó là tất cả tốt và tốt, nhưng Ruby 1.9 allows UTF-8 source code. Vì vậy, là "chữ hoa" hoặc "lowecase" như xa như điều này là có liên quan? Điều gì về (tập hợp con nghiêm ngặt) hoặc Ɖfoo?

Có quy tắc chung không?

Sau đó:

Ruby-core đã được xem xét một số các nhà khai thác toán học. Ví dụ

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

sẽ cho phép

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

Tôi rất thích nhìn thấy

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

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

my_infinite_range = (1..∞) 

return 'foo' if x ≠ y 

2.21 ≈ 2.2 
+1

là Ruby biến thành APL? –

Trả lời

0

tôi không thể có được IRB chấp nhận UTF-8 ký tự, vì vậy tôi sử dụng một kịch bản thử nghiệm (/tmp/utf_test.rb).

"λ" hoạt động tốt như một tên biến:

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

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

"λ" cũng hoạt động tốt như một tên phương pháp:

# 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 

Nó không làm việc như một hằng số, mặc dù:

# 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) 

Cũng không phiên bản vốn:

# 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) 

Nghi ngờ của tôi là tên liên tục phải bắt đầu bằng chữ cái viết hoa ASCII (phải khớp với /^[A-Z]/).

2

Tôi không biết những gì ruby ​​sẽ làm gì nếu bạn đã sử dụng mở rộng ký tự UTF8 như định danh trong mã nguồn của bạn mã, nhưng tôi biết những gì tôi sẽ làm, mà sẽ là slap bạn lộn ngược mặt sau của đầu và nói với bạn KHÔNG LÀM VIỆC

+1

Typo: tell => yell ;-) – webmat

3

OK, câu trả lời đùa của tôi đã không đi xuống quá tốt.

This mailing list question, with answer from Matz cho biết các phương thức được xây dựng trong các phương pháp String#upcaseString#downcase của Ruby 1.9 sẽ chỉ xử lý các ký tự ASCII.

Nếu không tự mình thử nghiệm, tôi sẽ xem đây là bằng chứng mạnh mẽ rằng tất cả các ký tự không phải ascii trong mã nguồn có thể được coi là chữ thường.

Ai đó có thể tải xuống và biên dịch phiên bản mới nhất 1.9 và xem không?

1

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 

Tôi rất thích nhìn thấy một ai đó cố gắng để gõ chương trình trên một bàn phím tiếng Anh: P

+0

Bối cảnh của bạn chắc chắn được bảo đảm, nhưng tôi sẵn sàng xây dựng các macro Textmate để biến tab thành viên + thành ∈. Cách gõ không ngắn hơn bao gồm ?, nhưng tôi nghĩ đoạn mã nói điều tôi muốn nói rõ ràng hơn. Tôi chắc chắn đó là một vấn đề về vị giác; Tôi thực sự thích các lớp toán rời rạc của tôi ở trường đại học. –

1

Trong Ruby 1.9.2-p0 (YARV) kết quả cũng giống như trong bài gốc (ví dụ: Foo :: bar # => # NoMethodError: undefined method 'bar' cho Foo: Module). Ngoài ra, các chữ cái có dấu không may được coi là phương pháp trên và cũng không thấp và không có kết quả.

Ví dụ:

"á".upcase 
=> "á" 
"á" == "Á".downcase 
=> false 
Các vấn đề liên quan