لماذا لا أستطيع أن سلسلة سلسلتين وتعيينها إلى رمز؟

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

سؤال

و. . . كما في هذا المثال:

helloworld.rb:1: syntax error, unexpected '=', expecting $end
:helloworld = "hello ".concat("world")

وفكرت إذا كنت تستخدم CONCAT أنا تعديل السلسلة "مرحبا" واضاف "العالم" لذلك ومن ثم تعيين في نهاية المطاف السلسلة الناتجة - "مرحبا العالم" - إلى: رمز helloworld على الجانب الأيسر من يساوي إشارة. وأعتقد أن من شأنه أن يكون قانونيا، تماما كما لو كنت قد كتبت:

:helloworld = "hello world"

وأوه، الانتظار، التي لا تعمل إما. (رئيس الخدوش).

هل كانت مفيدة؟

المحلول

وجرب هذا:

:"hello world"

نصائح أخرى

وحرف روبي لا يمكن أن يكون القيم المخصصة لها لأنها تمثل قيمة الكنسي. إذا كنت ترغب في بناء رمزا من سلسلة، يمكنك استخدام "مرحبا" .concat ( "العالم"). to_sym.

وحرف ومربكة عندما تأتي من اللغات التي ليس لديها أي شيء مثلهم. لا يمكنك تعيين لحرف، وهذا ليس ما كنت ل.

وفيما يلي بعض الأمثلة التي قد تساعد على تفسير ذلك.

5.times do |i|
  # a new string is created in each iteration of the loop
  puts "my string".object_id

  # there is only ever one symbol for each possible value
  # so a new object is not created during each iteration
  puts :my_symbol.object_id

  # this often makes a difference when you're using them for things like hash keys
  #some_method(:name => 'bob')
  #some_method('name' => 'bob')
end

والفارق الكبير الآخر هو أن المقارنة رمز هو مجرد المقارنة المؤشر.

ولعل ما كنت تبحث فعلا عن هو ثابت؟ ويمكن ديناميكيا، المشار إليها في وقت لاحق، وتحصل على تحذير إذا حاولت إعادة تعيين واحد.

>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"

لا يمكنك تعيين إلى رمز ولكن يمكنك العودة رمزا وهي سلسلة من الرموز الأخرى، على الرغم من أن لديك لتمرير من خلال سلاسل بقدر ما أعرف (أود أن أعرف إذا كان هناك طريقة أفضل).

لنفترض أنك تريد الحصول على :myway رمز بدءا من :my الرموز و:way؛

(:my.to_s + :way.to_s).to_sym # return :myway

حسنا، نعم. لا يمكنك تعيين لحرف. هل تعني شيئا مثل:

foo = { :helloworld => "hello ".concat("world") }

class Symbol
  def + (to)
    return "#{self}#{to}".to_sym
  end
end

وهذا عمل بالنسبة لي

@foo = 'world'
"hello #{@foo}".to_s.to_sym

والناتج =>: "العالم مرحبا"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top