Что означает левый сдвиг в Ruby? - PullRequest
2 голосов
/ 10 марта 2011

Может кто-нибудь объяснить мне, что означает синтаксис "сдвиг влево" в ruby?

Например, у меня есть это

File.open( folder, 'w' ){ |f| f << datavalue } 

Я знаю, что это означает запись каждого значения в папку, но часть |f| f << datavalue не имеет смысла для меня. Почему f находится внутри скобки относительно сдвига влево и записи значения в папку?

В принципе, я не понимаю значения этой строки

{ |f| f << datavalue } 

Ответы [ 3 ]

4 голосов
/ 10 марта 2011

File.open( folder, 'w' ){ |f| f << datavalue } - это то же самое, что и запись:

File.open( folder, 'w' ) do |f|
  f << datavalue
end

Оба являются примерами блочной нотации Ruby.Блоки в Ruby являются анонимными методами.Переменные, ожидаемые блоком, объявляются между вертикальными чертами.В этом случае переменная f представляет объект файла, возвращаемый с помощью команды File.open.

Что касается оператора <<.Здесь он используется как конкатенатор.Я считаю, что это называется оператором добавления, когда используется на объектах (таких как строки, массивы, в данном случае файл).Исключением является случай, если объект числовой, то есть когда он становится оператором сдвига влево, чтобы сдвинуть биты числа.

0 голосов
/ 20 апреля 2019

Тогда ответ: это зависит.Я не хочу придираться, но у Руби вряд ли есть реальные операторы.В Ruby большинство «операторов» на самом деле являются методами, которые, возможно, так как в Ruby все является объектом.

Например, рассмотрим этот код

o.x = a + b

Здесь нет операторов, потому что на самом деле этотолько альтернативный способ написания этого кода

o.x=(a.+(b))

И x= - это имя метода установки, а + - это также просто имя метода объекта a.В Ruby символы, которые являются операторами в других языках, могут использоваться как часть имени метода (просто подумайте о ?, который обычно используется в именах методов Ruby).

Итак, этот код

a = b << c

Фактически это то же самое, что и запись

a = b.<<(c)

Так что << делает, зависит от того, как b реализует этот метод.

Например, для String << метод означает добавление.

a = "Hello, " << "Word"
# a == "Hello, Word"

Но в случае Fixnum метод << означает только сдвиг влево:

a = 5 << 2
# a == 20

Так что ответить на вопрос << невозможноозначает, что вы должны посмотреть в документации, что это означает для объекта, которому вы передаете этот метод.Если вы пишете свой собственный класс, вы можете просто реализовать этот оператор так, как вам нравится

class MyClass
  # If you prefer, can also be written as
  # def << x 
  def << ( x )
    # do something with x
  end
end

o = MyClass.new()
x = o << a

Вызывается ваш метод <<, и вы решаете, что он делает с a.

0 голосов
/ 10 марта 2011
some_text = "world!"
hello = "Hello, "

hello << some_text

puts hello # prints "Hello, world!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...