Если вы не хотите использовать 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;
}
Вам нужно понять одну вещь: в 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)
Надеюсь, это немного проясняет.
Я думаю, что это локально для файла, который вы объявили смещением. Считайте каждый файл самим методом.
Может быть, поместите все это в класс, а затем сделайте смещение переменной класса с помощью @@ offset = Point.new (100, 200);
?
Область видимости переменной в Ruby до некоторой степени контролируется сигилами. Переменные, начинающиеся с $
, являются глобальными, переменные с @
- это переменные экземпляра, @@
означает переменные класса, а имена, начинающиеся с заглавной буквы, являются константами. Все остальные переменные - локальные. Когда вы открываете класс или метод, это новая область видимости, а локальные переменные, доступные в предыдущей области, недоступны.
Обычно я предпочитаю избегать создания глобальных переменных. Есть два метода, которые обычно достигают той же цели, которую я считаю более чистой:
Создание константы в модуле. В этом случае вы поместите все классы, которым требуется смещение, в модуль Foo
и создайте константу Offset
, чтобы все классы могли получить доступ к Foo :: Смещение
.
Определите метод доступа к значению. Вы можете определить метод глобально, но, опять же, я думаю, что лучше инкапсулировать его в модуль или класс. Таким образом, данные будут доступны там, где они вам нужны, и вы даже можете изменить их, если это необходимо, но структура вашей программы и право собственности на данные будут более ясными. Это больше соответствует принципам объектно-ориентированного проектирования.
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.