Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide / Программирование на Ruby 1.9 (3-е издание): Руководство прагматичного программиста

→However, an object that is totally secretive is pretty useless—you can create it, but then you can't do anything with it. You'll normally define methods that let you access and manipulate the state of an object, allowing the outside world to interact with the object. These externally visible facets of an object are called its attributes.
0 Однако, объект, который вообще не имеет открытых методов, довольно бесполезен - вы можете создать его, но вы ничего не можете с ним делать. Обычно вы будете определять методы, которые позволят управлять состоянием объекта, разрешая внешнему миру взаимодействовать с объектом. Эти видимые внешне аспекты объекта называются атрибуты.
→The BooklnStock objects we've created so far have an internal state (the ISBN and price). That state is private to those objects—no other object can access an object's instance variables. In general, this is a Good Thing. It means that the object is solely responsible for maintaining its own consistency.
0 Объекты BookInStock, которые мы до сих пор создавали, имеют внутреннее состояние (ISBN и цена). Это состояние для каждого объекта свое - другие объекты не имеют доступа к переменным экземпляра данного объекта. Вообще, это хорошо. Это означает, что объект сам ответственен за поддержание собственной целостности.
→Objects and Attributes
0 Объекты и атрибуты
→There's something going on here that's both trivial and profound. See how the values we set into the instance variables @isbn and @price in the initialize method are subsequently available in the to_s method? That shows how instance variables work—they're stored with each object and available to all the instance methods of those objects.
0 Здесь происходит кое-что тривиальное и одновременно важное. Посмотрите как значения, которые мы присваиваем переменным экземпляра @isbn и @price в методе initialize, впоследствии доступны в методе to_s . Это демонстрирует, как работают переменные экземпляра - они сохраняются в каждом объекте и доступны всем методам экземпляра.
→Finally, this code illustrates a simple piece of validation. The Float method takes its argument and converts it to a floating-point number,1 terminating the program with an error if that conversion fails. (Later in the book we'll see how to handle these exceptional situations.) What we're doing here is saying that we want to accept any object for the price parameter as long as that parameter can be converted to a float. We can pass in a float, an integer, and even a string containing the representation of a float, and it will work. Let's try this now. We'll create three objects, each with different initial state. The p method prints out an internal representation of an object. Using it, we can see that in each case our parameters got transferred into the object's state, ending up as instance variables:
1 В завершение, этот код иллюстрирует простую проверку. Метод Float принимает аргумент и преобразует его в число с плавающей запятой. Программа завершается ошибкой, если преобразование прошло неудачно. (Позже в этой книге мы увидим, как обрабатывать исключительные ситуации.) То, что мы делаем здесь есть утверждение того, что можно принять любой объект в качестве параметра price, если этот параметр может быть преобразован в число с плавающей запятой. Мы можем передать методу число с плавающей запятой(float), целое число(integer) и даже строку(string), содержащую представление числа с плавающей запятой, и это будет работать. Теперь давайте попробуем. Создадим три объекта, каждый с уникальным начальным состоянием. Метод p выводит внутренне представление объекта. Используя его, можем видеть, что в каждом случае наши параметры были переданы объекту, а внутри объекта присвоены переменным экземпляра.
→This method also illustrates something that often trips up newcomers to Ruby. Notice how we say @isbn = isbn. It's easy to imagine that the two variables here, @isbn and isbn, are somehow related—it looks like they have the same name. But they don't. The former is an instance variable, and the "at" sign is actually part of its name.
1 Этот метод также иллюстрирует то, что часто сбивает с толку новичков в Ruby. Заметьте, как мы произносим "@isbn = isbn". Легко представить, что здесь две переменные, @isbn и isbn, которые как-то связаны - это выглядит так, будто-бы у них одно и то же имя. Но это не так. Первая - это переменная экземпляра, и символ "@" - это часть ее имени.
→The best way to fix this is to provide the objects with an initialize method. This lets us set the state of each object as it is constructed. We store this state in instance variables inside the object. (Remember instance variables? They're the ones that start with an @ sign.) Because each object in Ruby has its own distinct set of instance variables, each object can have its own unique state.
0 Лучший способ исправить это - снабдить объекты методом инициализации. Это позволит нам устанавливать состояние каждого объекта в момент создания. (Помните переменные экземпляра? Это те, которые начинаются с символа @.) Благодаря тому, что каждый объект в Ruby имеет свой собственный набор переменных экземпляра, каждый объект может находиться в своем собственном уникальном состоянии.
→After this code runs, we'd have two distinct objects, both of class BooklnStock. But, apart from the fact that they have different identities, these two objects are otherwise the same— there's nothing to distinguish one from the other. And, what's worse, these objects actually don't hold any of the information we need them to hold.
0 После выполнения этого кода у нас было бы два различных объекта, оба класса BookInStock. Но, кроме того факта, что они не идентичны, эти два объекта одно и тоже - нет ничего, чем бы один отличался от другого. И, что еще хуже, эти объекты на самом деле не содержат никакой информации, для хранения которой они нам и нужны.
→And having them built in, rather than tacked on through a library interface, makes a big difference.
0 Большая разница в том, что поддержка регулярных выражений встроена, а не прикреплена через интерфейс библиотеки.
→Most of Ruby’s built-in types will be familiar to all programmers. A majority of languages have strings, integers, floats, arrays, and so on. However, regular expression support is typically built into only scripting languages, such as Ruby, Perl, and awk. This is a shame, because regular expressions, although cryptic, are a powerful tool for working with text.
0 Большинство встроенных типов Ruby знакомы всем программистам. Большинство языков имеют string, integer, float, массивы и т.д. Однако, поддержка регулярных выражений обычно встроена только в скриптовые языки, такие как Ruby, Perl, awk. Это позор, потому что регулярные выражения, несмотря на загадочность, являются мощным инструментом для работы с текстом.
→Ruby has all the usual control structures, such as if statements and while loops. Java, C, and Perl programmers may well get caught by the lack of braces around the bodies of these statements. Instead, Ruby uses the keyword end to signify the end of a body:
0 В Ruby есть все обычные управляющие структуры, такие как операторы if и while. Java, C, Perl программисты могут отметить отсутствие фигурных скобок вокруг тел этих операторов. Вместо этого, Ruby использует ключевое слово end чтобы обозначить конец тела оператора:
→In fact, symbols are so frequently used as hash keys that Ruby 1.9 introduces a new syntax— you can use name: value pairs to create a hash 1.9 if the keys are symbols:
0 Фактически, идентификаторы так часто использовались как хеш-ключи, что Ruby 1.9 вводит новый синтаксис - вы можете использовать пары "имя: значение" чтобы создать хеш 1.9, если ключи являются идентификаторами.
→Ruby offers a cleaner alternative. Symbols are simply constant names that you don’t have to predeclare and that are guaranteed to be unique. A symbol literal starts with a colon and is normally followed by some kind of name:
0 Ruby предлагает более чистую альтернативу. Идентификаторы являются просто именами констант, которые вы не должны объявлять заранее и которые гарантированно уникальны. Литерал идентификатора начинается с двоеточия и обычно сопровождается некоторым именем.
→There’s no need to assign some kind of value to a symbol—Ruby takes care of that for you. Ruby also guarantees that no matter where it appears in your program, a particular symbol will have the same value. That is, you can write the following:
0 Нет необходимости присваивать значение идентификатору - Ruby позаботится об этом. Ruby также гарантирует, что независимо от того, где идентификатор появляется в вашей программе, его значение будет тем же самым. Т.е., вы можете написать следующее:
→Ruby offers a cleaner alternative. Symbols are simply constant names that you don’t have to predeclare and that are guaranteed to be unique. A symbol literal starts with a colon and is normally followed by some kind of name:
0 Символьный литерал начинается с двоеточия и обычно сопровождается некоторым именем.
→As the previous example shows, a hash by default returns nil when indexed by a key it doesn’t contain. Normally this is convenient, because nil means false when used in conditional expressions. Sometimes you’ll want to change this default. For example, if you’re using a hash to count the number of times each different word occurs in a file, it’s convenient to have the default value be zero. Then you can use the word as the key and simply increment the corresponding hash value without worrying about whether you’ve seen that word before. This is easily done by specifying a default value when you create a new, empty hash. (The full source for the word frequency counter is on page 72.)
0 Как показано в предыдущем примере, хеш по умолчанию возвращает nil при попытке получить значение по ключу, которого в хеше нет. Обычно это удобно, потому что nil означает false, когда используется в условных выражениях. Иногда вы можете захотеть изменить это значение по умолчанию. Например, если вы используете хеш, чтобы подсчитать, сколько раз каждое слово встречается в файле, удобно иметь значение по умолчанию 0. Тогда вы можете использовать слово как ключ и просто увеличивать соответствующее хеш-значение не беспокоясь о том, видели ли вы это слово до этого. Это легко можно сделать определяя значение по умолчанию при создании нового, пустого хеша. (Полный листинг "счетчика" на странице 72.)
→Hashes are indexed using the same square bracket notation as arrays. In this code, we’ll use the p method to write the values to the console. This works like puts but displays values such as nil explicitly.
0 Хеши индексируются с использованием тех же квадратных скобок как и массивы. В этом коде мы будем использовать метод р для вывода значений в консоль. Этот метод работает также как и puts, но явно выводит значения такие как nil.
→The thing to the left of the => is the key, and the thing to the right is the corresponding value. Keys in a particular hash must be unique—you can’t have two entries for “drum.” The keys and values in a hash can be arbitrary objects—you can have hashes where the values are arrays, other hashes, and so on.
1 То, что слева от =>, является ключем, а то, что справа - соответствующим значением. Ключи в хеше должны быть уникальны - вы не можете иметь два вхождения для "drum". Ключи и значения в хеше могут быть произвольными объектами - у вас могут хеши, в которых значениями являются массивы, другие хеши и т.д.
→For example, you may want to map musical instruments to their orchestral sections. You could do this with a hash:
0 Например, вы можете отобразить музыкальные инструменты на их оркестровые разделы. Вы могли бы сделать это при помощи хеша:
→Ruby hashes are similar to arrays. A hash literal uses braces rather than square brackets.
0 Хеши в Ruby сходны с массивами. Литерал хэша использует фигурные скобки вместо квадратных скобок.
Резюме
Пол:
мужчина
Родной язык:
русский
С нами:
с 16 июня 2011 г. (5603 дня)
Не является членом клуба.
Деятельность:
32 версии перевода с общим рейтингом 7
10 комментариев
Карма: 1 (оценок: 1)
Написать tartuff22 личное сообщение