Ruby 1.9는 소스 코드에서 문자 대소문자를 어떻게 처리하나요?

StackOverflow https://stackoverflow.com/questions/22764

  •  09-06-2019
  •  | 
  •  

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top