2012-05-05 2 views
4

Так что я оба новичок в Prolog и Ruby. Изучение Пролога в университете и Ruby на мой собственный. И я думал, если в Ruby есть переменная «не заботясь» или «отбросить», как есть в Prolog.Ruby «не волнует меня», как у Prolog?

Я только что открыл IRB и просто сделал это (предположит, подчеркивание было «не волнует» знак)

1.9.2-p290 :003 > _, b, c = [1,2,3] 
=> [1, 2, 3] 
1.9.2-p290 :004 > b 
=> 2 
1.9.2-p290 :005 > c 
=> 3 

Результатов на самом деле то, что я ожидал. Но тогда мне было интересно, о том, что где значении подчеркивания и к какому классу он был

1.9.2-p290 :006 > _ 
=> 3 
1.9.2-p290 :008 > _.class 
=> Fixnum 

Ну, это странно. Разве это не должно отбрасывать ценность? Почему сохраняется другая ценность?

Затем, делая больше тестов с подчеркиванием, я увидел, что на самом деле произошло, оно имеет последнее оцениваемое значение.

1.9.2-p290 :017 > 1 
=> 1 
1.9.2-p290 :018 > _ 
=> 1 
1.9.2-p290 :019 > "string" 
=> "string" 
1.9.2-p290 :020 > _ 
=> "string" 
1.9.2-p290 :021 > Hash 
=> Hash 
1.9.2-p290 :022 > _ 
=> Hash 

Так что мой вопрос: на что же важно подчеркнуть? Это действительно неважно, переменная или что-то еще? Каково настоящее имя? (потому что я не нахожу много вещей с «не заботясь о рубиновой переменной» с google)

+2

Связанный вопрос: HTTP://stackoverflow.com/questions/9559561/where-and-how-is-the-underscore-variable-specified-in-ruby –

ответ

10

Что бросает вас в то, что вы видите два разных символа подчеркивания.

  1. В списках аргументов он действует как «не волнует переменную», как в Prolog.

  2. Вне списков аргументов это обычный идентификатор. В IRB он связан с предыдущим результатом. Поскольку ваш последний вход был c = 3, _ это 3. Это только в IRB, хотя - это не происходит в обычных программах Ruby.

+0

, так что на самом деле это не волнует переменную, и предполагается, что она используется для сохранения некоторой памяти? Не могли бы вы предоставить некоторую ссылку для документов? –

9
  1. В рубин сообщества, _ означает "не равно".
  2. В рубине язык, _ ничего не значит, это идентификатор, как и любой другой.
  3. В YARV Ruby интерпретатор предупреждение «неиспользуемая локальная переменная» подавляется для _, тем самым кодируя соглашение в # 1.
  4. В IRb, _ привязан к значению последнего выражения.
+1

Ничего себе, не понимал, что № 3 был YARV конкретным. Или, должен ли я сказать, я [спросил об этом в прошлом году] (http://stackoverflow.com/questions/6397078/when-did-assigned-but-unused-become-a-warning-for-ruby) и забыл. –

+0

Собственно, он может быть или не быть частью спецификации языка Ruby. Все другие разработчики, как правило, копируют сообщения об ошибках и предупреждения YARV, поэтому для практических целей это может быть так же хорошо. –

5

Подчеркивание в Ruby действует как любая нормальная переменная, за исключением того, что это немного более важно. Это действительно означает «Мне все равно».

Для, например, скажем, вы перекручивание через массив кто есть элементы 3-элементные массивы:

array = [[1,2,3],[4,5,6],[7,8,9],...] 

Допустим, вы заинтересованы только в средней стоимости.С _ вы могли бы сделать это:

array.each do |_, number, _| 
    # do something 
end 

Если вы попытаетесь сделать это с другим переменным, вы получите (ожидаемую) ошибку, что вы дублируетесь переменным:

array.each do |v, number, v| 
    # do something 
end 

=> SyntaxError: (eval):2: duplicated argument name 
+0

Хороший! Принят ваш. Так что это не просто идентификатор, в качестве аргумента используется специальное поведение –

+0

@IsmaelAbreu: Да, как я уже сказал в мае ... – Chuck

+0

@ Чак хмм. Теперь я не знаю, что делать. Мне понравилось это из-за примера того, что вы можете сделать с _, который вы не можете с нормальной переменной. Вы злитесь, если я принимаю это вместо вас? Хорошо, я соглашусь с вами снова, так как вы на самом деле сказали это, но я думаю, что этот пример важен. –

Смежные вопросы