Как Вы используете глобальные переменные или постоянные величины в Ruby?

Если вы не хотите использовать Boost-библиотеку , то здесь есть решение, использующее только стандартный C ++ заголовок io.

#include <iostream>

struct iequal
{
    bool operator()(int c1, int c2) const
    {
        // case insensitive comparison of two characters.
        return std::toupper(c1) == std::toupper(c2);
    }
};

bool iequals(const std::string& str1, const std::string& str2)
{
    // use std::equal() to compare range of characters using the functor above.
    return std::equal(str1.begin(), str1.end(), str2.begin(), iequal());
}

int main(void)
{
    std::string str_1 = "HELLO";
    std::string str_2 = "hello";

    if(iequals(str_1,str_2))
    {
        std::cout<<"String are equal"<<std::endl;   
    }

    else
    {
        std::cout<<"String are not equal"<<std::endl;
    }


    return 0;
}
67
задан Martin Thoma 11 April 2014 в 09:50
поделиться

4 ответа

Вам нужно понять одну вещь: в Ruby все является объектом. Учитывая это, если вы не определяете свои методы в Module или Class , Ruby поместит их в класс Object . Таким образом, ваш код будет локальным для области Object .

Типичный подход к объектно-ориентированному программированию заключается в инкапсуляции всей логики внутри класса:

class Point
  attr_accessor :x, :y

  # If we don't specify coordinates, we start at 0.
  def initialize(x = 0, y = 0)
    # Notice that `@` indicates instance variables.
    @x = x
    @y = y
  end

  # Here we override the `+' operator.
  def +(point)
    Point.new(self.x + point.x, self.y + point.y)
  end

  # Here we draw the point.
  def draw(offset = nil)
    if offset.nil?
      new_point = self
    else
      new_point = self + offset 
    end
    new_point.draw_absolute
  end

  def draw_absolute
    puts "x: #{self.x}, y: #{self.y}"
  end
end

first_point = Point.new(100, 200)
second_point = Point.new(3, 4)

second_point.draw(first_point)

Надеюсь, это немного проясняет.

53
ответ дан 24 November 2019 в 14:30
поделиться

Я думаю, что это локально для файла, который вы объявили смещением. Считайте каждый файл самим методом.

Может быть, поместите все это в класс, а затем сделайте смещение переменной класса с помощью @@ offset = Point.new (100, 200); ?

]
-3
ответ дан 24 November 2019 в 14:30
поделиться

Область видимости переменной в Ruby до некоторой степени контролируется сигилами. Переменные, начинающиеся с $ , являются глобальными, переменные с @ - это переменные экземпляра, @@ означает переменные класса, а имена, начинающиеся с заглавной буквы, являются константами. Все остальные переменные - локальные. Когда вы открываете класс или метод, это новая область видимости, а локальные переменные, доступные в предыдущей области, недоступны.

Обычно я предпочитаю избегать создания глобальных переменных. Есть два метода, которые обычно достигают той же цели, которую я считаю более чистой:

  1. Создание константы в модуле. В этом случае вы поместите все классы, которым требуется смещение, в модуль Foo и создайте константу Offset , чтобы все классы могли получить доступ к Foo :: Смещение .

  2. Определите метод доступа к значению. Вы можете определить метод глобально, но, опять же, я думаю, что лучше инкапсулировать его в модуль или класс. Таким образом, данные будут доступны там, где они вам нужны, и вы даже можете изменить их, если это необходимо, но структура вашей программы и право собственности на данные будут более ясными. Это больше соответствует принципам объектно-ориентированного проектирования.

111
ответ дан 24 November 2019 в 14:30
поделиться

One of the reasons why the global variable needs a prefix (called a "sigil") is because in Ruby, unlike in C, you don't have to declare your variables before assigning to them. The sigil is used as a way to be explicit about the scope of the variable.

Without a specific prefix for globals, given a statement pointNew = offset + point inside your draw method then offset refers to a local variable inside the method (and results in a NameError in this case). The same for @ used to refer to instance variables and @@ for class variables.

In other languages that use explicit declarations such as C, Java etc. the placement of the declaration is used to control the scope.

10
ответ дан 24 November 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: