كيف يتعامل Ruby 1.9 مع حالات الأحرف في الكود المصدري؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

في روبي 1.8 والإصدارات الأقدم،

Foo

هو ثابت (فئة، وحدة، أو ثابت آخر).بينما

foo

هو متغير.الفرق الرئيسي هو كما يلي:

module Foo
  bar = 7
  BAZ = 8
end

Foo::BAZ
# => 8

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

هذا كل شيء جيد وجيد، ولكن روبي 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]/).

نصائح أخرى

حسنًا، جوابي المزاح لم يكن جيدًا.

سؤال القائمة البريدية هذا، مع إجابة من ماتز يشير إلى أن Ruby 1.9 مدمج String#upcase و String#downcase ستتعامل الأساليب مع أحرف ASCII فقط.

بدون اختباره بنفسي، سأرى هذا كدليل قوي على أن جميع الأحرف غير ascii في التعليمات البرمجية المصدر من المحتمل أن يتم اعتبارها أحرفًا صغيرة.

هل يمكن لأي شخص تنزيل وتجميع أحدث إصدار 1.9 ومشاهدته؟

لا أعرف ما الذي ستفعله روبي إذا استخدمت أحرف UTF8 الموسعة كمعرفات في كود المصدر الخاص بك، لكنني أعرف ما سأفعله، وهو أن أصفعك رأسًا على عقب وأخبرك لا تفعل ذلك

أنا أحب أن أرى

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).كما أن الحروف ذات اللكنة للأسف لا تعتبر علوية أو سفلية، والطرق ذات الصلة لا تؤدي إلى أي نتيجة.

أمثلة:

"á".upcase
=> "á"
"á" == "Á".downcase
=> false
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top