Ruby 1.9는 소스 코드에서 문자 대소문자를 어떻게 처리하나요?
문제
Ruby 1.8 및 이전 버전에서는
Foo
상수(클래스, 모듈 또는 다른 상수)입니다.반면
foo
변수입니다.주요 차이점은 다음과 같습니다.
module Foo
bar = 7
BAZ = 8
end
Foo::BAZ
# => 8
Foo::bar
# NoMethodError: undefined method 'bar' for Foo:Module
다 좋은데 Ruby 1.9 UTF-8 소스 코드 허용.그렇습니다 ℃
이에 관한 한 "대문자" 또는 "소문자"는 무엇입니까?는 어때 ⊂
(엄격한 하위 집합) 또는 Ɖfoo
?
일반적인 규칙이 있나요?
나중에:
Ruby-core는 이미 일부 수학 연산자를 고려하고 있습니다.예를 들어
module Kernel
def √(num)
...
end
def ∑(*args)
...
end
end
허용 할
x = √2
y = ∑(1, 45, ...)
나는보고 싶다
my_proc = λ { |...| ... }
x ∈ my_enumerable # same as my_enumerable.include?(x)
my_infinite_range = (1..∞)
return 'foo' if x ≠ y
2.21 ≈ 2.2
해결책 5
IRB가 UTF-8 문자를 허용하도록 할 수 없어서 테스트 스크립트(/tmp/utf_test.rb
).
"λ"는 변수 이름으로 잘 작동합니다.
# encoding: UTF-8
λ = 'foo'
puts λ
# from the command line:
> ruby -KU /tmp/utf_test.rb
foo
"λ"는 메소드 이름으로도 잘 작동합니다.
# 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
하지만 상수로 작동하지는 않습니다.
# 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)
대문자 버전도 마찬가지입니다.
# 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)
내 의심은 상수 이름이 대문자 ASCII 문자로 시작해야 한다는 것입니다(일치해야 함). /^[A-Z]/
).
다른 팁
알았어, 내 농담 대답은 별로 좋지 않았어.
Matz의 답변이 포함된 메일링 리스트 질문입니다. Ruby 1.9가 내장되어 있음을 나타냅니다. String#upcase
그리고 String#downcase
메소드는 ASCII 문자만 처리합니다.
직접 테스트하지 않으면 소스 코드의 ASCII가 아닌 모든 문자가 소문자로 간주될 가능성이 높다는 강력한 증거로 볼 수 있습니다.
누군가 최신 1.9를 다운로드하고 컴파일하여 볼 수 있습니까?
소스 코드에서 확장된 UTF8 문자를 식별자로 사용한 경우 Ruby가 무엇을 할지 모르겠지만, 내가 무엇을 할 것인지는 알고 있습니다. 즉, 여러분의 뒤통수를 때리고 그렇게 하지 말라고 말하는 것입니다.
나는보고 싶다
my_proc = λ { |...| ... }
x ∈ my_enumerable # same as my_enumerable.include?(x)
my_infinite_range = (1..∞)
return 'foo' if x ≠ y
2.21 ≈ 2.2
누군가가 영어 키보드로 해당 프로그램을 입력하는 모습을 보고 싶습니다. :P
~ 안에 루비 1.9.2-p0(YARV) 결과는 원래 게시물과 동일합니다(예: Foo::bar #=> # NoMethodError:Foo:Module에 대해 정의되지 않은 메소드 'bar').또한 악센트가 있는 문자는 불행히도 상위 또는 하위로 간주되지 않으며 관련 방법은 결과를 얻지 못합니다.
예:
"á".upcase
=> "á"
"á" == "Á".downcase
=> false