diff --git a/app/ruby_engine.rb b/app/ruby_engine.rb index 436febd0..94cceedf 100644 --- a/app/ruby_engine.rb +++ b/app/ruby_engine.rb @@ -9,6 +9,16 @@ def run(source) raise NotImplementedError end + def exception_to_string(err) + # Beautify the backtrace a little bit + backtrace = err.backtrace + backtrace = backtrace.select { |i| i.include? '' } + backtrace = backtrace.map { |i| i.gsub(/.*()/, '\1') } + backtrace = ["(file)"] if backtrace.empty? + err.set_backtrace(backtrace) + err.full_message + end + def run_with_writer(source, writer, &block) @writer = writer @dots = 0 @@ -29,8 +39,6 @@ def loading(part = nil) # When you update the engines, ensure that they are tested correctly. # Update the engine list also in spec/playground_spec. ENGINES = [ - # Opal.new, - OpalWebWorker.new("1.7.1"), CRubyWASI.new( "https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.5.0-2022-12-25-a/dist/ruby.wasm", "3.2.0" @@ -41,6 +49,9 @@ def loading(part = nil) # "https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@next/dist/ruby.wasm", # "3.3.0dev" # ), + + # Opal.new, + OpalWebWorker.new("1.7.1"), ].each_with_object({}) do |engine, hash| hash[engine.engine_id] = engine end diff --git a/app/ruby_engine/cruby_wasi.rb b/app/ruby_engine/cruby_wasi.rb index 5d89f46e..0ec0fd56 100644 --- a/app/ruby_engine/cruby_wasi.rb +++ b/app/ruby_engine/cruby_wasi.rb @@ -74,8 +74,8 @@ def run(source) textDecoder = `new TextDecoder("utf-8")` %x{ wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { - const text = textDecoder.decode(buffer); if (fd == 1 || fd == 2) { + const text = textDecoder.decode(buffer); #{@writer.print_to_output(`text`, "")}; } return originalWriteSync(fd, buffer, offset, length, position); @@ -102,11 +102,18 @@ def run(source) `vm.setInstance(wasmInstance)`.await `wasi.setMemory(wasmInstance.exports.memory)` `vm.initialize()` + set_external_encoding = "Encoding.default_external = Encoding::UTF_8" + `vm.eval(set_external_encoding)` end yield `vm.eval(source).toString()` rescue JS::Error => err - @writer.log_error(err) + raise err + end + + def exception_to_string(err) + # "...: undefined method `reverse' for 40:Integer (NoMethodError)\n (Exception)\n" + super(err).sub(/\s+\(Exception\)\s*\z/, '') end end end diff --git a/app/try_ruby.rb b/app/try_ruby.rb index ac989f9e..5893295f 100644 --- a/app/try_ruby.rb +++ b/app/try_ruby.rb @@ -14,7 +14,7 @@ class TryRuby RUBY INITIAL_TRY_RESULT = 'Welcome ' * 3 - DEFAULT_RUBY_ENGINE = "opal-ww-1.7.1" + DEFAULT_RUBY_ENGINE = "cruby-3.2.0" def self.start instance @@ -397,14 +397,14 @@ def show_result(retval) # Do not check the answer if there is no regexp matcher if @current_item && @current_item.answer # Get last line of output - value_to_check = @output_buffer.length > 0 && !@output_buffer.last.empty? ? @output_buffer.last.chomp : '' + value_to_check = @output_buffer.join.rstrip.lines.last # Check if output matches the defined answer regexp # and print status message print_to_output("\n") from = count_lines - if !value_to_check.empty? && value_to_check.chomp.match(@current_item.answer) + if value_to_check && !value_to_check.empty? && value_to_check.match(@current_item.answer) @current_item.ok.each do |line| print_to_output(line) end @@ -431,13 +431,7 @@ def count_lines def log_error(err) unless err.is_a? String - # Beautify the backtrace a little bit - backtrace = err.backtrace - backtrace = backtrace.select { |i| i.include? '' } - backtrace = backtrace.map { |i| i.gsub(/.*()/, '\1') } - backtrace = ["(file)"] if backtrace.empty? - err.set_backtrace(backtrace) - err = err.full_message + err = @engine.exception_to_string(err) end from = count_lines diff --git a/source/try_ruby_en.json b/source/try_ruby_en.json index b8cfd5ce..2fefbc58 100644 --- a/source/try_ruby_en.json +++ b/source/try_ruby_en.json @@ -17,15 +17,15 @@ "17":{"lang":"EN","title":"Elemental","chapter":"N","answer":"^(12|35|47)$","ok":"Ok","error":"Almost","text":"

So we stored our lotto numbers inside variable ticket. How to get ‘em out again?

\n\n

We already saw that we can get the highest number with max. Similarly you can\nget the first or the last element of the list.\nBut what if you want a specific element?

\n\n

[ ]

\n\n

Ruby uses the square brackets [ ] to target an element.\nThe square brackets are very common in Ruby.\nThey are like sights used to line up a target. Exactly.\nThese brackets mean, “I am looking for ____” Ready, aim.

\n\n

Let’s get all of our lotto numbers:

\n\n
puts ticket[0]\nputs ticket[1]\nputs ticket[2]\n
\n\n

Why do we use [0], [1], [2]?

\n\n

And not [1], [2] and [3]? Is that some kind of Japanese Zen thing?\nNo, we computer people just like to begin counting from zero. It’s not just a Ruby thing,\nthis zero based indexing is used in most programming languages.

\n\n
\n

A little reminder: you can use the Copy button to copy the example code to the editor.

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"EN","title":"Summary #2 is Upon Us","chapter":"Y","answer":"\\w+","ok":"Does it rhyme?","error":"","text":"

Now, look how your second minute went:

\n\n

Errors

\n\n

If you try to reverse a number or do anything fishy, Ruby will tell you so.

\n\n

Arrays

\n\n

Arrays are lists for storing things in some order.\nWe also know how to create arrays and get items from arrays.

\n\n

Variables

\n\n

Variables save a thing and give it a name. You used the equals sign to do this. Like:\nticket = [14, 37, 18].

\n\n

2/8

\n\n

In all there are eight sections. You are two-eighths of the way there! This is simple stuff,\ndon’t you think? Good stuff up ahead.

\n\n

Let’s change directions for a moment. I’ve stuffed a bit of poetry for you in a certain variable.\nTake a look. Type:

\n\n
puts poem\n
\n","load_code":"poem = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, "19":{"lang":"EN","title":"Sadly, You Hate Toast Poetry","chapter":"N","answer":"(toast){0}","ok":"Excellent","error":"Still smells like toast to me","text":"

Look, it’s okay. You don’t have to like it. Hack it up, be my guest. Instead of toast, go for a\nmelon or something. Try this to see the new poem:

\n\n
poem.gsub("toast", "honeydew")\n
\n\n

The gsub method is short for global substitute. It replaces all occurences of “toast” with\n“honeydew”.

\n","load_code":"prev"}, -"20":{"lang":"EN","title":"Ready, Aim","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"Okay, sure. So the whole poem has been turned backwards.","error":"","text":"

Here’s a question: what happens when we reverse this whole poem?

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"EN","title":"Ready, Aim","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"Okay, sure. So the whole poem has been turned backwards.","error":"","text":"

Here’s a question: what happens when we reverse this whole poem?

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"EN","title":"Too Much Reversal","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"Yes, almost what we want","error":"","text":"

So the whole poem’s been turned backwards, letter-by-letter. I really wanted to just reverse the lines though.\nMove the last line up to first and the first line down to last.

\n\n

Backwards, but not that backwards.

\n\n

Here’s how:

\n\n
poem.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"EN","title":"Ringlets of Chained Methods","chapter":"N","answer":"^More still did (.+)","ok":"Good show, my friend!
The join method took that array of lines and put them together into a string.","error":"","text":"

So what do you see? What happened there? You typed poem.lines.reverse and what happened?

\n\n

Two things happened. You turned the poem into a list using lines.\nLines decides the way the string is split up and converts it into an Array.

\n\n

Then, you reversed that list. You had each line. You reversed them. That’s it.

\n\n

Let’s tack one more method on the end there:

\n\n
puts poem.lines.reverse.join\n
\n\n

Combining methods like this is called method chaining.

\n","load_code":"prev"}, +"22":{"lang":"EN","title":"Ringlets of Chained Methods","chapter":"N","answer":"My toast has flown from my hand","ok":"Good show, my friend!
The join method took that array of lines and put them together into a string.","error":"","text":"

So what do you see? What happened there? You typed poem.lines.reverse and what happened?

\n\n

Two things happened. You turned the poem into a list using lines.\nLines decides the way the string is split up and converts it into an Array.

\n\n

Then, you reversed that list. You had each line. You reversed them. That’s it.

\n\n

Let’s tack one more method on the end there:

\n\n
puts poem.lines.reverse.join\n
\n\n

Combining methods like this is called method chaining.

\n","load_code":"prev"}, "23":{"lang":"EN","title":"Of All the Summaries, #3 is Here Now","chapter":"Y","answer":"\\{\\}","ok":"You've made an empty hash!","error":"","text":"

Exclamations

\n\n

Methods may have exclamations (and also question marks) in their name.\nThese are just there to better explain what their function is. No big deal.

\n\n

String manipulation

\n\n

Search and change strings

\n\n

Chaining

\n\n

Chaining methods lets you get a lot more done. Break up a poem, reverse it, reassemble it:\npoem.lines.reverse.join

\n\n

At this point, you may want to tinker with the poem a bit more. A complete list of all the String\nmethods is here.

\n\n

Go ahead and try a few, such as: poem.downcase or poem.swapcase

\n\n

Ready?

\n\n

When you feel ready to move on, type:

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"EN","title":"A Wee Blank Book","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Yes that's a new review","error":"Use one of splendid, quite_good, mediocre, quite_not_good, abysmal.
Don't forget the colon","text":"

You’ve made an empty hash. A hash is like an array, only every one of its elements has a name.

\n\n

We’re going to stuff some miniature book reviews in our new hash. Here’s our rating system:

\n\n
    \n
  • :splendid → a masterpiece
  • \n
  • :quite_good → enjoyed, sure, yes
  • \n
  • :mediocre → equal parts great and terrible
  • \n
  • :quite_not_good → notably bad
  • \n
  • :abysmal → steaming wreck
  • \n
\n\n

To rate a book, put the title in square brackets and put the rating after the equals. For example:

\n\n
books["Gravitys Rainbow"] = :splendid\n
\n\n
\n

By now I think it is only fair to tell you that all lessons in TryRuby are separate from each other.\nSo if you go crazy typing book reviews here, you can only use ‘em in this lesson.
\nIf you want to use your reviews in the next lesson you should copy/paste them.
\nDon’t worry about this too much, each lesson has plenty of predefined stuff for you to play around with.

\n
\n","load_code":"books = {}"}, "25":{"lang":"EN","title":"More Bite-Size Reviews","chapter":"N","answer":"[3-9]","ok":"See, the length method works on strings, arrays and hashes.","error":"","text":"

Keep going, fill it up with reviews. And, if you want to see the whole list, just type: puts books

\n\n

Again, the ratings are: :splendid, :quite_good, :mediocre, :quite_not_good and :abysmal.

\n\n

These ratings are not strings. When you place a colon in front of a simple word, you get a symbol.\nSymbols are cheaper than strings (in terms of computer memory.) If you use a word over and over in your program,\nuse a symbol. Rather than having thousands of copies of that word in memory, the computer will store the symbol only\nonce.

\n\n

More importantly, a symbol tells you that it is not just any old word but has a meaning within your program.

\n\n

Enter 2 more bookreviews, use books.length to see how many reviews there are in the hash:

\n\n
books["The deep end"]  = :abysmal\nbooks["Living colors"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid}"}, "26":{"lang":"EN","title":"Wait, Did I Like Gravity's Rainbow?","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"I liked it a lot","error":"","text":"

One great thing about Ruby is that names are often reused, which means fewer names you need to remember.

\n\n

Remember how we retrieved items from an array using a number:
\nputs ticket[1].

\n\n

For a hash this works the same way, except we don’t use a number to get an element but a name.

\n\n

So, if you’d like to look up one of your old reviews, again put the title in the square. But leave off the equals.\nJust like this:

\n\n
puts books["Gravitys Rainbow"]\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre}"}, "27":{"lang":"EN","title":"Hashes as Pairs","chapter":"N","answer":"^\\[\".*\"\\]","ok":"You found the keys","error":"","text":"

Keep in mind that hashes won’t keep things in order. That’s not their job. It’ll just pair up\ntwo things: a key and a value.

\n\n

In your reviews, the book’s title is the key and the rating is the value.

\n\n

If you want to just see the titles of all the books you’ve reviewed:

\n\n
books.keys\n
\n\n

You can also try this with .values instead of .keys.

\n","load_code":"prev"}, -"28":{"lang":"EN","title":"Are You Harsh?","chapter":"N","answer":"\"mediocre\"","ok":"Great, wow! You've made a scorecard of your ratings","error":"","text":"

So are you giving out harsh, unfair reviews? Let’s keep score with a new hash ratings:

\n\n

Then, okay, now let’s count up your reviews. Just stay with me. Type:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

The straight line in the code is the pipe character, probably located right above the Enter key\non your keyboard.

\n\n

That += 1 line means: increase the value by 1.

\n\n

Don’t worry if you don’t understand everything that is going on here. It will be revealed later.

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, +"28":{"lang":"EN","title":"Are You Harsh?","chapter":"N","answer":":mediocre","ok":"Great, wow! You've made a scorecard of your ratings","error":"","text":"

So are you giving out harsh, unfair reviews? Let’s keep score with a new hash ratings:

\n\n

Then, okay, now let’s count up your reviews. Just stay with me. Type:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

The straight line in the code is the pipe character, probably located right above the Enter key\non your keyboard.

\n\n

That += 1 line means: increase the value by 1.

\n\n

Don’t worry if you don’t understand everything that is going on here. It will be revealed later.

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, "29":{"lang":"EN","title":"A Tally","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

One of the amazing new things we’ve just used is a block. We’re going to explore these more\nin this and the next lesson. But, basically, a block is a bit of Ruby code surrounded by curly\nbraces.

\n\n

Let’s try another block:

\n\n
5.times { print "Odelay! " }\n
\n\n

Blocks are always attached to methods. Like the times method, which takes the block and runs\nthe code over and over. (In our example: five times.)

\n","load_code":""}, "30":{"lang":"EN","title":"Have you got the time?","chapter":"N","answer":"^[0-9]$","ok":"You timed it just right!","error":"Run the block 0 to 9 times","text":"

As we saw in the first example with a block (when counting ratings) we can pass a value to the block. Which\nvalues are passed is determined by the method that is running the block.

\n\n

The values that are received by the block are placed in the variable name at the beginning of the block,\nbetween two pipe symbols: |

\n\n

Let’s try that with this block:

\n\n
5.times { |time|\n  puts time\n}\n
\n\n

Here, method .times sends a value to variable |time|. But note that variable time is only known within the block.

\n\n
\n

Did you notice that you can split code over multiple lines. This makes it a bit easier to read.

\n
\n","load_code":""}, "31":{"lang":"EN","title":"Now Arriving at Summary #4","chapter":"Y","answer":"","ok":"","error":"","text":"

This last lesson was a bit longer. You’ve probably used up three minutes learning about:

\n\n

Hashes

\n\n

The little dictionary with the curly pages: {}

\n\n

Symbols

\n\n

Tiny, efficient code words with a colon, like: :splendid

\n\n

Blocks

\n\n

Chunks of code which can be tacked on to many of Ruby’s methods. Here’s the code you used to\nbuild a scorecard:
\nbooks.values.each { |rate| ratings[rate] += 1 }

\n\n

Next

\n\n

In the next lesson we will delve a little bit deeper into methods.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"EN","title":"The Ripened Fruit of Your Own Creation","chapter":"N","answer":"^Tamed a shrew","ok":"That'll show those shrews","error":"","text":"

A new method is born. Let us use it now:

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"Tamed a shrew\"};end;"}, "36":{"lang":"EN","title":"Give and take","chapter":"N","answer":"\\d+","ok":"Right on. Bravo.","error":"","text":"

Most methods do not only want some parameters as input, but will also give something back.\nI have changed our method a bit so it will return a value to you. Try it:

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

Return

\n\n

And, since you’re getting so advanced and capable here, one other tip:\nyou can omit the word return from the last line of the method.\nRuby will automagically return the last value that was used inside the method.

\n\n

So we can change the last line to just: number_of_shrews.

\n\n

But since method .times also returns the number_of_shrews we can\nremove the entire last line. So in fact our original method already did what we wanted all along!

\n","load_code":""}, "37":{"lang":"EN","title":"Hello, Who's There? And Summary #5 Waves Its Hat!","chapter":"Y","answer":"","ok":"","error":"","text":"

Well done, well done, well done, well done!

\n\n

Truly, truly, truly, truly, truuuuuuuuly!

\n\n

Here’s the last few minutes of your life in review:

\n\n

Methods

\n\n

Methods can be defined with def and have a name. Methods make your program shorter\nand easier to read.

\n\n

Parameters

\n\n

Methods can have parameters.

\n\n

Return values

\n\n

Methods (almost) always return a value.

\n\n

Now

\n\n

To (be) or not to (be) is not a question to you anymore. Are you ready for some more Shakespeare?

\n","load_code":""}, -"38":{"lang":"EN","title":"The world is our oyster","chapter":"N","answer":"^\\{\\\"William","ok":"Good. Bit difficult to read.","error":"","text":"

So far we have been running programs that only use things that we have typed ourselves.\nWhich is nice, I mean that Odelaying was epic, but this is the internet era so it is about\ntime we included the rest of the world in our programming efforts.

\n\n

Many, many, many websites are available that you can ask for information. For instance\nthis link will give you all current Google news feeds\nabout Ruby.

\n\n

Your web browser will probably display it quite nicely for you. If you look at the source\n(type: control-U) you will see a long string of strangely formatted text. In the Google example\nit is in the rss format.

\n\n

Formats

\n\n

There are many other formats, with strange names, available and used on the web, like:\nhtml, xml and json. Yes, even this very website uses a couple of these.

\n\n

I have prepared a method for you that will fetch a list of the complete works of William\nShakespeare from the internet.\n(Don’t worry it actually comes from the same server that this website runs on, so\nwe’re not bothering anyone.)

\n\n

Get the data with:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"EN","title":"The world is our oyster","chapter":"N","answer":"^\\{\\\"William","ok":"Good. Bit difficult to read.","error":"","text":"

So far we have been running programs that only use things that we have typed ourselves.\nWhich is nice, I mean that Odelaying was epic, but this is the internet era so it is about\ntime we included the rest of the world in our programming efforts.

\n\n

Many, many, many websites are available that you can ask for information. For instance\nthis link will give you all current Google news feeds\nabout Ruby.

\n\n

Your web browser will probably display it quite nicely for you. If you look at the source\n(type: control-U) you will see a long string of strangely formatted text. In the Google example\nit is in the rss format.

\n\n

Formats

\n\n

There are many other formats, with strange names, available and used on the web, like:\nhtml, xml and json. Yes, even this very website uses a couple of these.

\n\n

I have prepared a method for you that will fetch a list of the complete works of William\nShakespeare from the internet.\n(Don’t worry it actually comes from the same server that this website runs on, so\nwe’re not bothering anyone.)

\n\n

Get the data with:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"EN","title":"Noble Kinsmen","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"That's much better","error":"","text":"

Okay we now have a list of plays from the internet. The list was in the json format.\nFortunately for us Ruby kindly provides a method to convert json data to a Ruby hash.\nThe get_shakey method already did that for us.

\n\n

But since the structure of the json data is retained in the hash, it is still a bit difficult to read.\nLet us write a method to display the plays nicely.

\n\n

If you inspect the list of plays carefully you will see that it has a kind of nested\nstructure. (This is actually quite common in data you get from the internet.)\nLooks like this:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

To list the plays we first have to access the top “William Shakespeare” hash element by its name.\nNext we have to iterate through each element below it.

\n\n

Ruby has a method for iterating. It is called each. We have seen it before when\ncreating our book rating system.

\n\n

Everything that method each returns is passed to a block:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"EN","title":"All together now","chapter":"N","answer":"^4$","ok":"Yes, Shakespeare wrote 4 plays in 1591","error":"Answer for the year 1591 should be 4","text":"

Now suppose we only want to know the names and number of plays written by Shakespeare\nin a certain year.

\n\n

Ruby lets us select values from a hash. The select method uses a block to let us\ndefine what to select and returns what it found.

\n\n

We can then use the results returned by select in the each method as before by\nsimply adding it after the select block. This is another example of method chaining, which we saw\nearlier when reversing a poem.

\n\n

I have prepared the count_plays method for you. See if you can find out how many plays\nwere written by Shakespeare in the year 1591. Try this:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

Did you notice that I chained the count method at the end of the each method. This gives\nus a return value for the count_plays method.

\n\n

There is another possibility for chaining here. See that lonely line s = get_shakey.\nYou could add the [“William Shakespeare”].select { |k, v| at the end of get_shakey\n(no dot needed in this case).

\n","load_code":"prev"}, "41":{"lang":"EN","title":"All's Well That Ends Well","chapter":"N","answer":"All's Well That Ends Well","ok":"True","error":"Use 1605 as the second parameter","text":"

Okay, we got some data from the internet, we selected what we wanted and printed it out.\nWhat is left to improve? We could print the results a bit prettier. Like add the year\nand align titles and years.

\n\n

This means printing several values on one line. Ruby has a neat way of doing\nthat. It is just like printing a string like: puts “Hi, my name is Jimmy”.\nBut instead of the literal value Jimmy we use the value of a variable.

\n\n

First replace Jimmy with #{}. If Ruby sees a hash symbol # followed by a curly brace {\nit looks for a variable between the first brace and the following closing brace }.\nSo we can use this: “Hi, my name is #{name}”.

\n\n

Let’s change our code a bit

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

I have added .ljust(30) to the title. This way the title is left justified with a minimum\nlength of 30 characters so the years align nicely.

\n\n

See if you can change the ouput of the program so that it shows the plays like this: 1600 -> As You Like It

\n\n

All’s Well That Ends Well? Hey we’re not done yet, but the end is in sight!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"EN","title":"The Stuff Apps are Made of","chapter":"N","answer":"","ok":"","error":"","text":"

You’ve opened up a new BlurbTM class. What is your blog entry made of?\nThe content, sure. Also, a time when the BlurbTM was posted. And a mood.

\n\n

Okay, so you’ve got the first line of the class, here’s the rest:

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

Class names always begin with a capital letter.

\n\n

(Still no output)

\n","load_code":""}, "48":{"lang":"EN","title":"Accessors Are the Dangling Limbs","chapter":"N","answer":"Blurb:","ok":"My first Blurb","error":"","text":"

Hey, good class, man. You’ve got a new BlurbTM class.

\n\n

In the class definition, you used a method called attr_accessor.\nThere are many attribute methods like this which add little settings to classes.\nThese attributes are just variables attached to a class.

\n\n

Think of it this way. A class is like a person. That star-shaped human thing out there.\nAnd the attributes are the dangling limbs, the different parts that make up a body and\nother people can shake hands with.

\n\n

Now

\n\n

To create a BlurbTM and set the content:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"EN","title":"An Object, That Neat Little Package","chapter":"N","answer":"Blurb:","ok":"Blurb updated","error":"","text":"

Go ahead and set the BlurbTM time and mood:

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"EN","title":"Quickening it Up","chapter":"N","answer":"^\\d{4}","ok":"Noted","error":"","text":"

Cool, your app is awesome. Hey, let’s make things a bit easier on you.\nYou’re not going to want to set the time like that every time you BlurbTM.

\n\n

You just want to type the content and set the mood, right?

\n\n

Let’s add an initialize method to our class. This method is called whenever a new BlurbTM\nis created.\nAt the same time we can limit the length of the BlurbTM content to 40 characters.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(That parameter content=“” is there to make sure that we know content is a string,\neven if no content parameter is passed to the initialize method.)

\n","load_code":""}, +"50":{"lang":"EN","title":"Quickening it Up","chapter":"N","answer":"^\\d{4}","ok":"Noted","error":"","text":"

Cool, your app is awesome. Hey, let’s make things a bit easier on you.\nYou’re not going to want to set the time like that every time you BlurbTM.

\n\n

You just want to type the content and set the mood, right?

\n\n

Let’s add an initialize method to our class. This method is called whenever a new BlurbTM\nis created.\nAt the same time we can limit the length of the BlurbTM content to 40 characters.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(That parameter content=“” is there to make sure that we know content is a string,\neven if no content parameter is passed to the initialize method.)

\n","load_code":""}, "51":{"lang":"EN","title":"You've Taught Your App to Reject Worthless Things","chapter":"N","answer":"Blurb:","ok":"Blurb added","error":"","text":"

Did you see how inside the class we used the at-symbols (@time).

\n\n

Outside the class, we use accessors:

\n\n
\n

blurb.time = Time.now

\n
\n\n

but inside we use the object’s variables:

\n\n
\n

@time = Time.now

\n
\n\n

They’re the exact same thing, but expressed in two different places of your program.

\n\n

Create another BlurbTM

\n\n

When a new BlurbTM is created, the initialize method is used to check for any\narguments to new.

\n\n

Uh, we need two arguments:

\n\n
Blurb2 = Blurb.new :confused, "I can not believe Mt. Hood was stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"EN","title":"A Giraffe Has Not Stolen Summary #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Aha, you’re here. And all in one piece. We’re still going to make your app real,\nbut until then, let’s review, okay?

\n\n

Classes

\n\n

Everything in Ruby is some kind of object. Classes explain objects, how a certain object works.\nFor example, you made a few BlurbTM objects and these objects are explained in the Blurb\nclass.\nIn other words: you call them Blurb objects.\nYou can use classes to (kinda) model real life objects.

\n\n

Accessors

\n\n

Accessors are variables attached to an object which can be used outside the object.\n(blurb2.time = Time.now)

\n\n

Object variables

\n\n

Object variables are the same variables you’re using for accessors, but inside the object.\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"EN","title":"Your Own Turf","chapter":"N","answer":"Blurbalizer:","ok":"My app created","error":"","text":"

Okay, let’s wrap things up, kid. Here’s the last chapter of the GRIPPING epic story of Try Ruby!\nNow that you’ve got a taste of how it all works, how are you going to use it around the house\nand in your grocer’s freezer?\nYou’re a great person (one of my favorites), but you need guidance.

\n\n

Let’s finish your app

\n\n

You have app entries, but no actual app.\nIt still needs a title, someplace to store all BlurbsTM and a timeline in order to work.

\n\n

Guess what, we’re going to use another class. I’ve given all the code for the new class in one go.\nJust take your time to study it.
\nI’m in no hurry, I’ll wait for you in the next lesson.

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # A fresh clean array\n                 # for storing Blurbs\n  end\n\n  def add_a_blurb(mood, content)\n    # The << means add to the end of the array\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/source/try_ruby_es.json b/source/try_ruby_es.json index 6788c937..bb9dac34 100644 --- a/source/try_ruby_es.json +++ b/source/try_ruby_es.json @@ -17,15 +17,15 @@ "17":{"lang":"ES","title":"Elemental","chapter":"N","answer":"^(12|35|47)$","ok":"Correcto","error":"Casi","text":"

Hemos almacenado nuestros números de lotería en la variable boleto. ¿Qué tal si los sacamos otra vez?

\n\n

Ya hemos visto que podemos obtener el número más alto con max. De igual modo, podemos\nobtener el primer (first) o último (last) elemento de la lista.\nPero, ¿y si queremos un elemento concreto?

\n\n

[ ]

\n\n

Ruby usa los paréntesis cuadrados [ ] para apuntar a un elemento.\nLos paréntesis cuadrados son muy comunes en Ruby.\nSon como una mirilla para apuntar a un objetivo. Exactamente.\nEstos paréntesis significan: “Estoy buscando a ___”. Preparados, apunten.

\n\n

Obtengamos todos nuestros números de lotería:

\n\n
puts boleto[0]\nputs boleto[1]\nputs boleto[2]\n
\n\n

¿Por qué usamos [0], [1], [2] y no [1], [2] y [3]? \n¿Es algún tipo de idea Zen japonesa?\nNo, a nosotros los programadores nos gusta empezar a contar desde cero. No es solo una cosa de Ruby,\nen la mayoría de lenguajes de programación los índices de este tipo suelen empezar en cero.

\n\n
\n

Un pequeño recordatorio: puedes usar el botón Copy para copiar el ejemplo al editor.

\n
\n","load_code":"boleto = [12, 47, 35]"}, "18":{"lang":"ES","title":"El Resumen #2 está con Nosotros","chapter":"Y","answer":"\\w+","ok":"¿Rima?","error":"","text":"

Ahora, mira cómo fue nuestro segundo minuto:

\n\n

Errores

\n\n

Si tratas de darle la vuelta a un número o hacer algo sospechoso, Ruby te lo dice.

\n\n

Arrays

\n\n

Los arrays son listas para almacenar cosas en orden.\nTambién sabemos cómo crear arrays y obtener elementos de arrays.

\n\n

Variables

\n\n

Las variables almacenan una cosa y le dan un nombre, usamos el signo igual para hacerlo. Así:\nboleto = [14, 37, 18].

\n\n

2/8

\n\n

En total hay ocho secciones. ¡Ya llevas dos octavos del camino! Por ahora son cosas simples, \n¿no crees? Las cosas interesantes te esperan más adelante.

\n\n

Cambiemos de dirección por un momento. He metido un poco de poesía para ti en una variable. \nEcha un vistazo. Escribe:

\n\n
puts poema\n
\n","load_code":"poema = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, "19":{"lang":"ES","title":"Desafortunadamente, odias la poesía sobre tostadas","chapter":"N","answer":"(toast){0}","ok":"Excelente","error":"Me sigue oliendo a tostada","text":"

Mira, no importa. No tiene por qué gustarte. Arréglalo, por favor. En lugar de toast (tostada), \nprueba con un melón o algo. Prueba esto para ver el nuevo poema:

\n\n
poema.gsub("toast", "honeydew")\n
\n\n

El método gsub es un diminutivo de “global substitute” (sustitución global). Reemplaza todas las ocurrencias de “toast” con\n“honeydew” (melón chino).

\n","load_code":"prev"}, -"20":{"lang":"ES","title":"Apunten. Fuego","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"De acuerdo, sí. Se ha dado la vuelta el poema entero.","error":"","text":"

Pregunta: ¿qué pasa si le damos la vuelta a todo este poema?

\n\n
poema.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"ES","title":"Apunten. Fuego","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"De acuerdo, sí. Se ha dado la vuelta el poema entero.","error":"","text":"

Pregunta: ¿qué pasa si le damos la vuelta a todo este poema?

\n\n
poema.reverse\n
\n","load_code":"prev"}, "21":{"lang":"ES","title":"Demasiado giro","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"Sí, casi lo que queremos","error":"","text":"

Así que el poema entero se ha dado la vuelta, letra a letra. Pero yo solamente quería dar la vuelta a las líneas.\nMover la última línea al principio y la primera al final.

\n\n

Al revés, pero no tan al revés.

\n\n

Así es como se haría:

\n\n
poema.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"ES","title":"Tirabuzón de Métodos en Cadena","chapter":"N","answer":"^More still did (.+)","ok":"Bien hecho, amigo mío.
El método join cogió el array de líneas y las puso juntas en un string.","error":"","text":"

¿Qué ves? ¿Qué ha pasado? Has escrito poema.lines.reverse y ¿qué ha pasado?

\n\n

Han pasado dos cosas. Has convertido el poema en una lista usando lines.\nLines decide la forma en la que un string se divide y lo convierte en un Array.

\n\n

Luego, has dado la vuelta a esa lista. Tenías cada una de las líneas. Les diste la vuelta. Eso es todo.

\n\n

Añadamos un nuevo método al final de la cadena:

\n\n
puts poema.lines.reverse.join\n
\n\n

Combinar métodos así se llama encadenar métodos.

\n","load_code":"prev"}, +"22":{"lang":"ES","title":"Tirabuzón de Métodos en Cadena","chapter":"N","answer":"My toast has flown from my hand","ok":"Bien hecho, amigo mío.
El método join cogió el array de líneas y las puso juntas en un string.","error":"","text":"

¿Qué ves? ¿Qué ha pasado? Has escrito poema.lines.reverse y ¿qué ha pasado?

\n\n

Han pasado dos cosas. Has convertido el poema en una lista usando lines.\nLines decide la forma en la que un string se divide y lo convierte en un Array.

\n\n

Luego, has dado la vuelta a esa lista. Tenías cada una de las líneas. Les diste la vuelta. Eso es todo.

\n\n

Añadamos un nuevo método al final de la cadena:

\n\n
puts poema.lines.reverse.join\n
\n\n

Combinar métodos así se llama encadenar métodos.

\n","load_code":"prev"}, "23":{"lang":"ES","title":"De Todos los Resúmenes, #3 Ya Está Aquí","chapter":"Y","answer":"\\{\\}","ok":"¡Has creado un Hash vacío!","error":"","text":"

Exclamaciones

\n\n

Los métodos pueden tener exclamaciones (y también interrogaciones) en el nombre.\nSolamente están ahí para explicar mejor su función. Nada importante.

\n\n

Manipulación de Strings

\n\n

Buscar y modificar strings

\n\n

Encadenar

\n\n

Encadenar métodos te permite hacer mucho más trabajo. Partir un poema, darle la vuelta, volverlo a ensamblar:

\n\n

poema.lines.reverse.join

\n\n

En este punto, puedes jugar con el poema un poco más. Puedes encontrar aquí una lista completa de todos los métodos de String.

\n\n

Adelante, prueba algunos de ellos como: poema.downcase o poema.swapcase

\n\n

¿Listo?

\n\n

Cuando estés listo para seguir, teclea:

\n\n
libros = {}\n
\n","load_code":"prev"}, "24":{"lang":"ES","title":"Un Diminuto Libro En Blanco","chapter":"N","answer":"^(esplendido|muy_bueno|mediocre|malo|abismal)$","ok":"Sí, eso es una nueva reseña","error":"Usa uno de :esplendido, :muy_bueno, :mediocre, :malo, :abismal.
No te olvides los dos puntos.","text":"

Has creado un hash vacío. Un hash es como un array, salvo que cada uno de sus elementos tiene un nombre.

\n\n

Vamos a meter algunas mini-reseñas de libros en nuestro nuevo hash. Aquí está nuestro sistema de puntuación:

\n\n
    \n
  • :esplendido → una obra maestra
  • \n
  • :muy_bueno → lo he disfrutado, sí
  • \n
  • :mediocre → genial y terrible a partes iguales
  • \n
  • :malo → notablemente malo
  • \n
  • :abismal → siniestro total
  • \n
\n\n

Para puntuar un libro, pon el título entre paréntesis cuadrados y la puntuación después del igual. Por ejemplo:

\n\n
libros["El Arco Iris de Gravedad"] = :esplendido\n
\n\n
\n

Es momento de contarte que las lecciones de TryRuby son independientes unas de otras.\nAsí que si te vuelves loco escribiendo reseñas ahora, solo las podrás usar en esta lección.\nSi quieres usar tus reseñas en la siguiente lección, te recomiendo que las copies y las pegues.\nPero no te preocupes demasiado, cada lección tiene suficiente contenido predefinido para que juegues con él.

\n
\n","load_code":"libros = {}"}, "25":{"lang":"ES","title":"Más mini-reseñas","chapter":"N","answer":"[3-9]","ok":"Ves, el método length funciona con strings, arrays y hashes.","error":"","text":"

Sigue, rellénalo con reseñas. Y, si quieres ver la lista entera, teclea: puts libros

\n\n

Las puntuaciones son: :esplendido, :muy_bueno, :mediocre, :malo y :abismal

\n\n

Estas puntuaciones no son strings. Cuando pones dos puntos delante de una palabra, obtienes un símbolo.\nLos símbolos son más baratos que los strings (en cuanto a memoria del ordenador). Si usas una palabra muchas veces\na lo largo de tu programa, mejor usa un símbolo. En lugar de tener miles de copias de esa palabra en memoria, \nel ordenador solamente almacenará el símbolo una vez.

\n\n

Y más importante, un símbolo indica que no se trata de una palabra cualquiera, sino de algo que tiene significado para tu programa.

\n\n

Introduce 2 reseñas más, usa libros.length para ver cuántas reseñas tienes en el hash:

\n\n
libros["El fin profundo"]  = :abismal\nlibros["Colores vivientes"] = :mediocre\n\nputs libros\n\nputs libros.length\n
\n","load_code":"libros = {\"El Arco Iris de Gravedad\" => :esplendido}"}, "26":{"lang":"ES","title":"Espera, ¿me gustó El Arco Iris de Gravedad?","chapter":"N","answer":"^(esplendido|muy_bueno|mediocre|malo|abismal)$","ok":"Me gustó mucho","error":"","text":"

Una gran cosa de Ruby es que normalmente se reutilizan los nombres, lo que significa que hay menos nombres que memorizar.

\n\n

Recuerda cómo se obtenían elementos de un array usando un número:\nputs boleto[1].

\n\n

Para un hash, funciona igual, excepto que no usamos un número para obtener un elemento, sino un nombre.

\n\n

Así que si quieres consultar una de tus antiguas reseñas, pon el título en el cuadrado. Pero no pongas un igual.\nAsí:

\n\n
puts libros["El Arco Iris de Gravedad"]\n
\n","load_code":"libros = {\"El Arco Iris de Gravedad\" => :esplendido, \"El fin profundo\" => :abismal, \"Colores vivientes\" => :mediocre}"}, "27":{"lang":"ES","title":"Hashes como Parejas","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Encontraste las claves","error":"","text":"

Ten en cuenta que los hashes no guardan las cosas en orden. Ese no es su trabajo. Simplemente emparejan dos cosas: una clave y un valor.

\n\n

En tus reseñas, el título del libro es la clave, y la puntuación es el valor.

\n\n

Si quieres ver solo los títulos de todos los libros que has reseñado:

\n\n
libros.keys\n
\n\n

Puedes probar también con .values en lugar de .keys

\n","load_code":"prev"}, -"28":{"lang":"ES","title":"¿Eres severo?","chapter":"N","answer":"\"mediocre\"","ok":"¡Genial! Has hecho un marcador de puntuaciones.","error":"","text":"

¿Estás siendo severo e injusto con tus puntuaciones? Hagamos la cuenta con un nuevo hash puntuaciones:

\n\n

Veamos, contemos tus reseñas. Sigue conmigo. Teclea:

\n\n
puntuaciones = Hash.new {0}\n\nlibros.values.each { |puntuacion|\n  puntuaciones[puntuacion] += 1\n}\n\nputs puntuaciones\n
\n\n

La linea vertical en el código es el carácter “pipe”, probablemente lo encontrarás en la tecla del 1 (pulsa Alt gr y el 1).

\n\n

El +=1 significa: incrementa el valor en 1.

\n\n

No te preocupes si no entiendes todo lo que está pasando. Todo será explicado en su momento.

\n","load_code":"libros = {\"El Arco Iris de Gravedad\" => :esplendido, \"El fin profundo\" => :abismal, \"Colores vivientes\" => :mediocre, \"Abejorros\" => :mediocre}"}, +"28":{"lang":"ES","title":"¿Eres severo?","chapter":"N","answer":":mediocre","ok":"¡Genial! Has hecho un marcador de puntuaciones.","error":"","text":"

¿Estás siendo severo e injusto con tus puntuaciones? Hagamos la cuenta con un nuevo hash puntuaciones:

\n\n

Veamos, contemos tus reseñas. Sigue conmigo. Teclea:

\n\n
puntuaciones = Hash.new {0}\n\nlibros.values.each { |puntuacion|\n  puntuaciones[puntuacion] += 1\n}\n\nputs puntuaciones\n
\n\n

La linea vertical en el código es el carácter “pipe”, probablemente lo encontrarás en la tecla del 1 (pulsa Alt gr y el 1).

\n\n

El +=1 significa: incrementa el valor en 1.

\n\n

No te preocupes si no entiendes todo lo que está pasando. Todo será explicado en su momento.

\n","load_code":"libros = {\"El Arco Iris de Gravedad\" => :esplendido, \"El fin profundo\" => :abismal, \"Colores vivientes\" => :mediocre, \"Abejorros\" => :mediocre}"}, "29":{"lang":"ES","title":"El Total","chapter":"N","answer":"\\w+","ok":"¡Requeteolé!","error":"","text":"

Una de las impresionantes novedades que acabamos de usar es un bloque. Vamos a explorar \nun poco más en esta lección y en la siguiente. Pero básicamente, un bloque es un poco de código Ruby\nrodeado de llaves ({}).

\n\n

Probemos otro bloque:

\n\n
5.times { print "¡Olé! " }\n
\n\n

Los bloques siempre se asocian a métodos. Por ejemplo el método times, que coge el bloque y ejecuta el código muchas veces (en nuestro ejemplo: cinco veces).

\n","load_code":""}, "30":{"lang":"ES","title":"¿Quién da la vez?","chapter":"N","answer":"^[0-9]$","ok":"Perfecto, justo a tiempo.","error":"Ejecuta el bloque entre 0 y 9 veces.","text":"

Como vimos en el primer ejemplo de un bloque (contando puntuaciones), podemos pasar una variable al bloque.\nQué valores se le pasan es algo que determina el método que ejecuta el bloque.

\n\n

Los valores recibidos por el bloque se colocan en la variable que aparece al principio del bloque, entre las barras verticales: |

\n\n

Probémoslo con este bloque:

\n\n
5.times { |vez|\n  puts vez\n}\n
\n\n

Aquí, el método .times envía un valor a la variable |vez|. Pero date cuenta que la variable vez solo se conoce dentro del bloque.

\n\n
\n

¿Te has dado cuenta de que puedes partir el código en varias líneas? Lo hace más fácil de leer.

\n
\n","load_code":""}, "31":{"lang":"ES","title":"Llegando al resumen #4","chapter":"Y","answer":"","ok":"","error":"","text":"

Esta última lección ha sido un poco más larga. Probablemente habrás usado hasta tres minutos aprendiendo acerca de:

\n\n

Hashes

\n\n

El pequeño diccionario con las páginas curvas: {}

\n\n

Símbolos

\n\n

Pequeñas y eficientes palabras clave, con dos puntos, como :esplendido

\n\n

Bloques

\n\n

Trozos de código que se pueden añadir a muchos métodos de Ruby. Aquí está el código que usaste para calcular la cuenta de puntuaciones:\nlibros.values.each { |puntuacion| puntuaciones[puntuacion] += 1 }

\n\n

Siguiente

\n\n

En la siguiente leccion ahondaremos un poco más en los métodos.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"ES","title":"The Ripened Fruit of Your Own Creation","chapter":"N","answer":"^Domé una fierecilla","ok":"Así aprenderán esas fierecillas.","error":"","text":"

Ha nacido un nuevo método. Usémoslo:

\n\n
domar 5\n
\n","load_code":"def domar(numero_de_fierecillas); numero_de_fierecillas.times {puts \"Domé una fierecilla\"}; end;"}, "36":{"lang":"ES","title":"Dar y recibir","chapter":"N","answer":"\\d+","ok":"Perfecto.","error":"","text":"

La mayoría de los métodos no solo reciben parametros de entrada, pero también devolverán algo.\nHe cambiado tu método un poco para que te devuelva un valor. Pruébalo:

\n\n
def domar( numero_de_fierecillas )\n  numero_de_fierecillas.times {\n    puts "Domé una fierecilla"\n  }\n  return numero_de_fierecillas\nend\n\nputs domar(3)\n
\n\n

Return

\n\n

Y cómo te estás volviendo tan experto y avanzado, una consejo más:\npuedes omitir la palabra return de la última línea del método.\nRuby automágicamente devolverá el último valor que se haya usado dentro del método.

\n\n

Así que podemos cambiar la última línea a esto: numero_de_fierecillas.

\n\n

Pero como el método .times también devuelve el numero_de_fierecillas podemos eliminar la última línea completamente.\n¡ Resulta que nuestra versión original del método ya era la que queríamos !

\n","load_code":""}, "37":{"lang":"ES","title":"¿Hola, quién está ahí? ¡ Y el resumen #5 agita su sombrero !","chapter":"Y","answer":"","ok":"","error":"","text":"

Bien hecho, bien hecho, bien hecho, ¡ bien hecho !

\n\n

De verdad, de verdad, de verdad, ¡ de verdaaaaaaaaaad !

\n\n

Aquí hay un resumen de los últimos minutos de tu vida:

\n\n

Métodos

\n\n

Los métodos se pueden definir con def y tienen un nombre. Los métodos hacen tu programa más corto y fácil de leer.

\n\n

Parámetros

\n\n

Los métodos pueden recibir parámetros.

\n\n

Valor de retorno

\n\n

Los métodos (casi) siempre devuelven un valor.

\n\n

Ahora

\n\n

“To (be) or not to (be)” ya no es una incógnita para ti. ¿Listo para más Shakespeare?

\n","load_code":""}, -"38":{"lang":"ES","title":"El mundo es nuestro","chapter":"N","answer":"^\\{\\\"William","ok":"Bien. Un poco difícil de leer","error":"","text":"

Hasta ahora hemos ejecutado programas que usan solamente cosas que hemos tecleado nosotros mismos.\nLo cual está bien, quiero decir, todos esos “Olé” fueron épicos, pero esto es la era de Internet, así que\nya es hora de incluir el resto del mundo en nuestros esfuerzos.

\n\n

Hay muchos, muchos, muchos sitios web a los que les puedes pedir información. Por ejemplo\neste enlace te dará todos los Feeds de noticias de Google sobre Ruby.

\n\n

Tu navegador probablemente te lo muestra muy bonito. Si miras al código fuente de la ṕágina (Ctrl+U)\nverás una larga cadena de texto extrañamente formateado. En el ejemplo de Google, está en el formato rss.

\n\n

Formatos

\n\n

Hay muchos otros formatos, con nombres extraños, disponibles y que se usan en la web, como:\nhtml, xml y json. Sí, incluso este mismo sitio web utiliza un par de ellos.

\n\n

He preparado un método para ti que recogerá una lista de las obras completas de William\nShakespeare de internet. (No te preocupes, de hecho proviene del mismo servidor donde se ejecuta este sitio web, así que no estamos molestando a nadie.)

\n\n

Obtén la información con:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"titulo\\\": \\\"Los dos hidalgos de Verona\\\", \\\"terminado\\\": 1591},\\\"2\\\": {\\\"titulo\\\": \\\"La fierecilla domada\\\", \\\"terminado\\\": 1591},\\\"3\\\": {\\\"titulo\\\": \\\"Enrique VI, Parte 2\\\", \\\"terminado\\\": 1591},\\\"4\\\": {\\\"titulo\\\": \\\"Enrique VI, Parte 3\\\", \\\"terminado\\\": 1591},\\\"5\\\": {\\\"titulo\\\": \\\"Enrique VI, Parte 1\\\", \\\"terminado\\\": 1592},\\\"6\\\": {\\\"titulo\\\": \\\"Tito Andrónico\\\", \\\"terminado\\\": 1592},\\\"7\\\": {\\\"titulo\\\": \\\"Ricardo III\\\", \\\"terminado\\\": 1593},\\\"8\\\": {\\\"titulo\\\": \\\"Eduardo III\\\", \\\"terminado\\\": 1593},\\\"9\\\": {\\\"titulo\\\": \\\"La comedia de las equivocaciones\\\", \\\"terminado\\\": 1594},\\\"10\\\": {\\\"titulo\\\": \\\"Trabajos de amor perdidos\\\", \\\"terminado\\\": 1595},\\\"11\\\": {\\\"titulo\\\": \\\"Trabajos de amor ganados\\\", \\\"terminado\\\": 1596},\\\"12\\\": {\\\"titulo\\\": \\\"Ricardo II\\\", \\\"terminado\\\": 1595},\\\"13\\\": {\\\"titulo\\\": \\\"Romeo y Julieta\\\", \\\"terminado\\\": 1595},\\\"14\\\": {\\\"titulo\\\": \\\"El sueño de una noche de verano\\\", \\\"terminado\\\": 1595},\\\"15\\\": {\\\"titulo\\\": \\\"El rey Juan\\\", \\\"terminado\\\": 1596},\\\"16\\\": {\\\"titulo\\\": \\\"El mercader de Venecia\\\", \\\"terminado\\\": 1597},\\\"17\\\": {\\\"titulo\\\": \\\"Enrique IV, Parte 1\\\", \\\"terminado\\\": 1597},\\\"18\\\": {\\\"titulo\\\": \\\"Las alegres comadres de Windsor\\\", \\\"terminado\\\": 1597},\\\"19\\\": {\\\"titulo\\\": \\\"Enrique IV, Parte 2\\\", \\\"terminado\\\": 1598},\\\"20\\\": {\\\"titulo\\\": \\\"Mucho ruido y pocas nueces\\\", \\\"terminado\\\": 1599},\\\"21\\\": {\\\"titulo\\\": \\\"Enrique V\\\", \\\"terminado\\\": 1599},\\\"22\\\": {\\\"titulo\\\": \\\"Julio Cesar\\\", \\\"terminado\\\": 1599},\\\"23\\\": {\\\"titulo\\\": \\\"Como gustéis\\\", \\\"terminado\\\": 1600},\\\"24\\\": {\\\"titulo\\\": \\\"Hamlet\\\", \\\"terminado\\\": 1601},\\\"25\\\": {\\\"titulo\\\": \\\"La decimosegunda noche\\\", \\\"terminado\\\": 1601},\\\"26\\\": {\\\"titulo\\\": \\\"Troilo y Crésida\\\", \\\"terminado\\\": 1602},\\\"27\\\": {\\\"titulo\\\": \\\"Tomás Moro\\\", \\\"terminado\\\": 1604},\\\"28\\\": {\\\"titulo\\\": \\\"Medida por medida\\\", \\\"terminado\\\": 1604},\\\"29\\\": {\\\"titulo\\\": \\\"Otelo\\\", \\\"terminado\\\": 1604},\\\"30\\\": {\\\"titulo\\\": \\\"A buen fin no hay mal tiempo\\\", \\\"terminado\\\": 1605},\\\"31\\\": {\\\"titulo\\\": \\\"El rey Lear\\\", \\\"terminado\\\": 1606},\\\"32\\\": {\\\"titulo\\\": \\\"Timón de Atenas\\\", \\\"terminado\\\": 1606},\\\"33\\\": {\\\"titulo\\\": \\\"Macbeth\\\", \\\"terminado\\\": 1606},\\\"34\\\": {\\\"titulo\\\": \\\"Antonio y Cleopatra\\\", \\\"terminado\\\": 1606},\\\"35\\\": {\\\"titulo\\\": \\\"Pericles\\\", \\\"terminado\\\": 1608},\\\"36\\\": {\\\"titulo\\\": \\\"Coriolano\\\", \\\"terminado\\\": 1608},\\\"37\\\": {\\\"titulo\\\": \\\"Cuento de invierno\\\", \\\"terminado\\\": 1611},\\\"38\\\": {\\\"titulo\\\": \\\"Cimbelino\\\", \\\"terminado\\\": 1610},\\\"39\\\": {\\\"titulo\\\": \\\"La tempestad\\\", \\\"terminado\\\": 1611},\\\"40\\\": {\\\"titulo\\\": \\\"Cardenio\\\", \\\"terminado\\\": 1613},\\\"41\\\": {\\\"titulo\\\": \\\"Enrique VIII\\\", \\\"terminado\\\": 1613},\\\"42\\\": {\\\"titulo\\\": \\\"Los dos nobles caballeros\\\", \\\"terminado\\\": 1614}}}\");end;"}, +"38":{"lang":"ES","title":"El mundo es nuestro","chapter":"N","answer":"^\\{\\\"William","ok":"Bien. Un poco difícil de leer","error":"","text":"

Hasta ahora hemos ejecutado programas que usan solamente cosas que hemos tecleado nosotros mismos.\nLo cual está bien, quiero decir, todos esos “Olé” fueron épicos, pero esto es la era de Internet, así que\nya es hora de incluir el resto del mundo en nuestros esfuerzos.

\n\n

Hay muchos, muchos, muchos sitios web a los que les puedes pedir información. Por ejemplo\neste enlace te dará todos los Feeds de noticias de Google sobre Ruby.

\n\n

Tu navegador probablemente te lo muestra muy bonito. Si miras al código fuente de la ṕágina (Ctrl+U)\nverás una larga cadena de texto extrañamente formateado. En el ejemplo de Google, está en el formato rss.

\n\n

Formatos

\n\n

Hay muchos otros formatos, con nombres extraños, disponibles y que se usan en la web, como:\nhtml, xml y json. Sí, incluso este mismo sitio web utiliza un par de ellos.

\n\n

He preparado un método para ti que recogerá una lista de las obras completas de William\nShakespeare de internet. (No te preocupes, de hecho proviene del mismo servidor donde se ejecuta este sitio web, así que no estamos molestando a nadie.)

\n\n

Obtén la información con:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"titulo\"=>\"Los dos hidalgos de Verona\", \"terminado\"=>1591},\"2\"=>{\"titulo\"=>\"La fierecilla domada\", \"terminado\"=>1591},\"3\"=>{\"titulo\"=>\"Enrique VI, Parte 2\", \"terminado\"=>1591},\"4\"=>{\"titulo\"=>\"Enrique VI, Parte 3\", \"terminado\"=>1591},\"5\"=>{\"titulo\"=>\"Enrique VI, Parte 1\", \"terminado\"=>1592},\"6\"=>{\"titulo\"=>\"Tito Andrónico\", \"terminado\"=>1592},\"7\"=>{\"titulo\"=>\"Ricardo III\", \"terminado\"=>1593},\"8\"=>{\"titulo\"=>\"Eduardo III\", \"terminado\"=>1593},\"9\"=>{\"titulo\"=>\"La comedia de las equivocaciones\", \"terminado\"=>1594},\"10\"=>{\"titulo\"=>\"Trabajos de amor perdidos\", \"terminado\"=>1595},\"11\"=>{\"titulo\"=>\"Trabajos de amor ganados\", \"terminado\"=>1596},\"12\"=>{\"titulo\"=>\"Ricardo II\", \"terminado\"=>1595},\"13\"=>{\"titulo\"=>\"Romeo y Julieta\", \"terminado\"=>1595},\"14\"=>{\"titulo\"=>\"El sueño de una noche de verano\", \"terminado\"=>1595},\"15\"=>{\"titulo\"=>\"El rey Juan\", \"terminado\"=>1596},\"16\"=>{\"titulo\"=>\"El mercader de Venecia\", \"terminado\"=>1597},\"17\"=>{\"titulo\"=>\"Enrique IV, Parte 1\", \"terminado\"=>1597},\"18\"=>{\"titulo\"=>\"Las alegres comadres de Windsor\", \"terminado\"=>1597},\"19\"=>{\"titulo\"=>\"Enrique IV, Parte 2\", \"terminado\"=>1598},\"20\"=>{\"titulo\"=>\"Mucho ruido y pocas nueces\", \"terminado\"=>1599},\"21\"=>{\"titulo\"=>\"Enrique V\", \"terminado\"=>1599},\"22\"=>{\"titulo\"=>\"Julio Cesar\", \"terminado\"=>1599},\"23\"=>{\"titulo\"=>\"Como gustéis\", \"terminado\"=>1600},\"24\"=>{\"titulo\"=>\"Hamlet\", \"terminado\"=>1601},\"25\"=>{\"titulo\"=>\"La decimosegunda noche\", \"terminado\"=>1601},\"26\"=>{\"titulo\"=>\"Troilo y Crésida\", \"terminado\"=>1602},\"27\"=>{\"titulo\"=>\"Tomás Moro\", \"terminado\"=>1604},\"28\"=>{\"titulo\"=>\"Medida por medida\", \"terminado\"=>1604},\"29\"=>{\"titulo\"=>\"Otelo\", \"terminado\"=>1604},\"30\"=>{\"titulo\"=>\"A buen fin no hay mal tiempo\", \"terminado\"=>1605},\"31\"=>{\"titulo\"=>\"El rey Lear\", \"terminado\"=>1606},\"32\"=>{\"titulo\"=>\"Timón de Atenas\", \"terminado\"=>1606},\"33\"=>{\"titulo\"=>\"Macbeth\", \"terminado\"=>1606},\"34\"=>{\"titulo\"=>\"Antonio y Cleopatra\", \"terminado\"=>1606},\"35\"=>{\"titulo\"=>\"Pericles\", \"terminado\"=>1608},\"36\"=>{\"titulo\"=>\"Coriolano\", \"terminado\"=>1608},\"37\"=>{\"titulo\"=>\"Cuento de invierno\", \"terminado\"=>1611},\"38\"=>{\"titulo\"=>\"Cimbelino\", \"terminado\"=>1610},\"39\"=>{\"titulo\"=>\"La tempestad\", \"terminado\"=>1611},\"40\"=>{\"titulo\"=>\"Cardenio\", \"terminado\"=>1613},\"41\"=>{\"titulo\"=>\"Enrique VIII\", \"terminado\"=>1613},\"42\"=>{\"titulo\"=>\"Los dos nobles caballeros\", \"terminado\"=>1614}}}; end;"}, "39":{"lang":"ES","title":"Nobles caballeros","chapter":"N","answer":"^Los dos nobles caballeros$","ok":"Mucho mejor","error":"","text":"

Bien, ahora tenemos una lista de obras obtenidas de internet. Esta lista estaba en el formato json.\nAfortunadamente para nosotros, Ruby amablemente nos ofrece un método para convertir datos en json a un hash de Ruby.\nEl método get_shakey hace eso por nosotros.

\n\n

Pero como la estructura de los datos en json se mantiene en el hash, sigue siendo un poco difícil de leer.\nEscribamos un método para mostrar las obras más adecuadamente.

\n\n

Si miras detenidamente la lista de obras, verás que sigue una especie de estructura anidada\n(esto es bastante frecuente en los datos que se obtienen de internet).\nSe parece a esto:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “titulo”: “Los dos hidalgos de Verona”
      • \n
      • “terminado”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “titulo”: “La fierecilla domada”
      • \n
      • “terminado”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Para listas las obras, primero tenemos que acceder al elemento de primer nivel del hash “William Shakespeare” por su nombre.\nDespués tenemos que iterar todos los elementos bajo él.

\n\n

Ruby tiene un método para iterar. Se llama each. Lo hemos visto antes, \ncuando creamos el sistema de reseñas de libros.

\n\n

Todo lo que el método each devuelve se le pasa a un bloque:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["titulo"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"ES","title":"Todo en conjunto","chapter":"N","answer":"^4$","ok":"Sí, Shakespeare escribió 4 obras en 1591","error":"La respuesta correcta para el año 1591 es 4","text":"

Supongamos que queremos saber los nombres y el número de obras escritas por Shakespeare en un año concreto.

\n\n

Ruby nos permite seleccionar (select) valores de un hash. El método select utiliza un bloque\npara definir qué tiene que seleccionar, y nos devuelve lo que encuentre.

\n\n

Podemos entonces utilizar los resultados devueltos por select en el metodo each como antes\nsimplemente añadiendolo después del bloque para el select. Esto es otro ejemplo de encadenar métodos, \nque vimos con anterioridad al darle la vuelta al poema.

\n\n

He preparado el método cuenta_obras para ti. Mira a ver si puedes averiguar cuántas obras\nescribió Shakespeare en el año 1591. Prueba esto:

\n\n
def cuenta_obras(anyo)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["terminado"] == anyo\n    }.each { |key, val|\n      puts val["titulo"]\n    }.count\nend\n\nputs cuenta_obras(0)\n
\n\n

¿Te has dado cuenta de cómo he encadenado el método count al final del método each?\nEsto nos da un valor de retorno para el método cuenta_obras.

\n\n

Hay otra posibilidad de encadenar. ¿Ves esa solitaria linea: s = get_shakey?

\n\n

Podrías añadir el [“William Shakespeare”].select { |k, v| a continuación de get_shakey\n(no se necesita punto en este caso).

\n\n
\n

Nota: en Ruby podrías escribir año con la ñ, pero parece que Opal, lo que usamos para ejecutar Ruby en el navegador tiene problemas con estos caracteres.

\n
\n","load_code":"prev"}, "41":{"lang":"ES","title":"A buen fin no hay mal tiempo","chapter":"N","answer":"A buen fin no hay mal tiempo","ok":"Cierto","error":"Usa 1605 como segundo parámetro","text":"

Bien, tenemos ciertos datos de internet, hemos seleccionado lo que queríamos y lo hemos imprimido en pantalla.\n¿Qué queda por mejorar? Podríamos poner más bonitos los resultados. Por ejemplo,\nañadir el año, y alinear los títulos y años.

\n\n

Eso implica imprimir varios valores en una línea. Ruby tiene una manera muy limpia de hacerlo.\nEs como imprimir un string como: puts “Hola, me llamo Juan”.\nPero en lugar del valor literal Juan podemos usar el valor de una variable.

\n\n

Primero, reemplazamos Juan con #{}. Si Ruby ve un símbolo de almohadilla # seguido de una llave de abrir {, buscará una variable entre la primera llave y la siguiente llave de cerrar }.\nAsí que podríamos usar esto: “Hola, me llamo #{nombre}”.

\n\n

Cambiemos nuestro código un poco:

\n\n
def imprimir_obras(anyo_desde, anyo_hasta)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      anyo_desde <= v["terminado"] &&\n      anyo_hasta   >= v["terminado"]\n    }.each { |k, v|\n      puts "#{v["titulo"].ljust(30)} #{v["terminado"]}"\n    }\nend\nimprimir_obras(1600, 1605)\n
\n\n

He añadido .ljust(30) al título. De este modo, el título se justifica a la izquierda con una longitud mínima de 30 caracteres, para que los años se alineen y quede más bonito.

\n\n

A ver si puedes cambiar la salida del programa para que las obras se muestren así: 1600 -> Como gustéis

\n\n

¿A buen fin no hay mal tiempo? Todavía no hemos terminado, pero !la meta está a la vista!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"ES","title":"Las Cosas de las que están hechas las Aplicaciones","chapter":"N","answer":"","ok":"","error":"","text":"

Has abierto una nueva clase BlurbTM. ¿De qué estan hechas tus entradas del blog?\nEl contenido, por supuesto. También la hora a la que el BlurbTM se publicó. Y un estado de ánimo.

\n\n

Bien, ya tienes la primera línea de la clase. Aquí está el resto:

\n\n
class Blurb\n  attr_accessor :contenido, :tiempo, :animo\nend\n
\n\n

Los nombres de clases empiezan por mayúscula.

\n\n

(Todavía no hay salida en la pantalla)

\n","load_code":""}, "48":{"lang":"ES","title":"Los 'Accessors' son las extremidades colgantes","chapter":"N","answer":"Blurb:","ok":"Mi primer Blurb","error":"","text":"

Buena clase, amigo. Tienes una nueva clase BlurbTM.

\n\n

En la definición de la clase, usaste un método llamado attr_accessor.\nHay muchos métodos de attributos como este que añaden pequeños ajustes.\nEstos atributos son simplemente variables adjuntadas a una clase.

\n\n

Pienslo de esta manera. Una clase es como una persona. Esa cosa humana con forma de estrella de ahí.\nY los atributos son las extremidades colgantes, las diferentes partes que forman el cuerpo y con las que otras\npersonas pueden extrecharle las manos.

\n\n

Ahora

\n\n

Para crear un BlurbTM y fijar su contenido:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.contenido = "¡El Everest ha sido robado!"\n
\n","load_code":"class Blurb;attr_accessor :contenido,:tiempo,:animo;end"}, "49":{"lang":"ES","title":"El Objeto, ese Genial Pequeño Paquete","chapter":"N","answer":"Blurb:","ok":"Blurb actualizado","error":"","text":"

Ve y fija la hora y el ánimo del BlurbTM:

\n\n
blurb1.tiempo = Time.now\nblurb1.animo = :enfermo\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.contenido=\"¡El Everest ha sido robado!\""}, -"50":{"lang":"ES","title":"Acelerandolo todo","chapter":"N","answer":"^\\d{4}","ok":"Apuntado","error":"","text":"

Genial, tu aplicación es impresionante. Vamos a hacer las cosas un poco más fáciles para ti.\nNo vas a querer fijar la hora así cada vez que publiques un BlurbTM.

\n\n

Simplemente quieres escribir el contenido y fijar el estado de ánimo, ¿verdad?

\n\n

Añadamos un método initialize a nuestra clase. Este método se llama cada vez que se crea un nuevo BlurbTM.\nA la misma vez podemos limitar la longitud del contenido del BlurbTM a 40 caracteres.

\n\n
class Blurb\n  attr_accessor :contenido, :tiempo, :animo\n\n  def initialize(animo, contenido="")\n    @tiempo    = Time.now\n    @contenido = contenido[0..39]\n    @animo    = animo\n  end\nend\n\nBlurb.new.tiempo\n
\n\n

(Ese parámetro contenido=“” está ahí para asegurarnos de que tenemos un string como contenido, aunque no le pasemos nada al método initialize).

\n","load_code":""}, +"50":{"lang":"ES","title":"Acelerandolo todo","chapter":"N","answer":"^\\d{4}","ok":"Apuntado","error":"","text":"

Genial, tu aplicación es impresionante. Vamos a hacer las cosas un poco más fáciles para ti.\nNo vas a querer fijar la hora así cada vez que publiques un BlurbTM.

\n\n

Simplemente quieres escribir el contenido y fijar el estado de ánimo, ¿verdad?

\n\n

Añadamos un método initialize a nuestra clase. Este método se llama cada vez que se crea un nuevo BlurbTM.\nA la misma vez podemos limitar la longitud del contenido del BlurbTM a 40 caracteres.

\n\n
class Blurb\n  attr_accessor :contenido, :tiempo, :animo\n\n  def initialize(animo, contenido="")\n    @tiempo    = Time.now\n    @contenido = contenido[0..39]\n    @animo    = animo\n  end\nend\n\nBlurb.new(:sick).tiempo\n
\n\n

(Ese parámetro contenido=“” está ahí para asegurarnos de que tenemos un string como contenido, aunque no le pasemos nada al método initialize).

\n","load_code":""}, "51":{"lang":"ES","title":"Has Enseñado a tu Aplicación a Rechazar Cosas Sin Valor","chapter":"N","answer":"Blurb:","ok":"Blurb añadido","error":"","text":"

¿Has visto cómo dentro de la clase usamos el símbolo arroba (@tiempo).

\n\n

Fuera de la clase, usamos los accessors:

\n\n
\n

blurb.tiempo = Time.now

\n
\n\n

pero dentro usamos las variables del objeto:

\n\n
\n

@tiempo = Time.now

\n
\n\n

Son exactamente la misma cosa, pero expresada en dos sitios diferentes de tu programa.

\n\n

Crea otro BlurbTM

\n\n

Cuando se crea un nuevo BlurbTM, se usa el método initialize para chequear los argumentos de new.

\n\n

Eh, necesitamos dos argumentos:

\n\n
Blurb2 = Blurb.new :confuso, "¡No puedo creer que hayan robado el Everest!"\n
\n","load_code":"class Blurb;attr_accessor :contenido,:tiempo,:animo;def initialize(animo, contenido=\"\");@tiempo=Time.now;@contenido=contenido[0..39];@animo=animo;end;end;blurb1=Blurb.new(:enfermo,\"¡El Everest ha sido robado!\")"}, "52":{"lang":"ES","title":"Ninguna Jirafa Ha Robado el Resumen #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Ah, estás aquí. Y de una pieza. Todavía tenemos que hacer realidad tu aplicación,\npero mientras tanto, revisemos, ¿de acuerdo?

\n\n

Clases

\n\n

Todas las cosas en Ruby son un tipo de objeto. Las clases explican los objetos, cómo funciona un cierto objeto.\nPor ejemplo, has creado unos cuantos objetos BlurbTM y esos objetos están explicados en la clase Blurb.\nDicho de otro modo: los llamamos objetos Blurb.\nPuedes usar clases para modelar (en cierto modo) los objetos de la vida real.

\n\n

Accessors

\n\n

Los Accessors son variables adjuntas a un objetos que se pueden usar desde fuera del objeto.\n(blurb2.tiempo = Time.now)

\n\n

Variables de objetos

\n\n

Las variables de objetos son las mismas variables que estás usando como accessors, pero dentro del objeto.\n(@tiempo = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confuso, ¡No puedo creer que hayan robado el Everest!\""}, "53":{"lang":"ES","title":"Tu Propio Territorio","chapter":"N","answer":"Blurbalizer:","ok":"Aplicación creada.","error":"","text":"

Bien, cerremos todo esto, chico. !Este es el último capítulo de la FASCINANTE y épica historia de Try Ruby !\nAhora que has probado un poco cómo funciona todo, ¿cómo lo vas a usar en tu casa y en la nevera de la frutería?\nEres una gran persona (una de mis favoritas), pero todavía necesitas que te guíe.

\n\n

Completemos la aplicación

\n\n

Tienes entradas de tu aplicación, pero una aplicación real.\nTodavía necesita un título, algún lugar para almacenar todos los BlurbsTM y una cronología, para que todo funcione bien.

\n\n

Adivina, vamos a usar otra clase. He puesto todo el código para la nueva clase de golpe.\nTómate tu tiempo para estudiarlo.\nNo tengo prisa, te espero en la siguiente lección.

\n\n
class Blurbalizer\n  def initialize(titulo)\n    @titulo  = titulo\n    @blurbs = [] # Un array nuevo y vacío para almacenar Blurbs\n  end\n\n  def crear_un_blurb(animo, contenido)\n    # El << significa añadir al final del array\n    @blurbs << Blurb.new(animo, contenido)\n  end\n\n  def mostrar_cronologia\n    puts "Blurbalizer: #{@titulo} tiene #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.tiempo\n    }.reverse.each { |t|\n      puts "#{t.contenido.ljust(40)} #{t.tiempo}"\n    }\n  end\nend\n\nmi_app = Blurbalizer.new "El Gran Blurb"\n
\n","load_code":"class Blurb;attr_accessor :contenido,:tiempo,:animo;def initialize(animo, contenido=\"\");@tiempo=Time.now;@contenido=contenido[0..39];@animo=animo;end;end"}, diff --git a/source/try_ruby_ja.json b/source/try_ruby_ja.json index a2ea7f7c..7bbb3820 100644 --- a/source/try_ruby_ja.json +++ b/source/try_ruby_ja.json @@ -3,12 +3,12 @@ "3":{"lang":"JA","title":"数と数式","chapter":"N","answer":"^[0-9\\.,-]{1,}$","ok":"よくできました","error":"","text":"

Rubyは数と数学記号を理解できます。以下のような数式も入力してみましょう。

\n\n
4 * 10\n5 - 12\n30 / 4\n
\n","load_code":""}, "4":{"lang":"JA","title":"異なる出力","chapter":"N","answer":"^[0-9\\.,-]{1,}$","ok":"正しく出力されました","error":"","text":"

数式をいくつか入力したのに、答えは最後の1つしか表示されなかったことに気づきましたか?\n何が起こっているのでしょうか?

\n\n
\n

このWebサイトを使いやすくするため、プログラムの実行結果を\n上の出力用画面にコピーするようにしています。\nなので、数式を入力すると、その結果が見られます。\nしかし、それは最後の結果だけです。 そして出力が空だったときのみです。

\n
\n\n

2つ以上の数式を入力しても、Rubyは最後の数式の結果しか返してくれません。

\n\n

もちろん画面をコントロールすることもできます! それぞれの数式の前に puts と(間に空白を入れて)入力してみましょう。\nputsは ‘画面に何かを出力(put)する’ という意味になります。

\n\n

以下を試してみましょう。

\n\n
puts 4 * 10\nputs 5 - 12\nputs 30 / 4\n
\n\n

最後の数式のputsを削除して何が起こるか確認してみましょう。

\n","load_code":""}, "5":{"lang":"JA","title":"名前を言ってみる","chapter":"N","answer":"[a-zA-Z]{1,1}","ok":"完ぺきです。名前を表す文字から文字列を作り出しました","error":"","text":"

いいですね、コンピュータは計算を手軽にすばやく扱います。\n次に移りましょう。逆さまになった名前を見てみたくないですか?

\n\n

まず、引用符のなかにあなたの苗字を入力してみてください。次のような感じです。

\n\n
"Jimmy"\n
\n","load_code":""}, -"6":{"lang":"JA","title":"名前を逆さまに言ってみる","chapter":"N","answer":"\\w+","ok":"たしまきでくよ","error":"","text":"

コンピュータが処理できる文字の集まりのことを文字列といいます。\n文字を一並びに干された洗濯物、引用符をその端をつまんでいる洗濯ハサミだと思ってください。\n引用符は文字列のはじめとおわりを表します。

\n\n

名前を逆さまにするには、つぎのように入力します。

\n\n
"Jimmy".reverse\n
\n\n

(カンマを忘れないで!)

\n","load_code":""}, +"6":{"lang":"JA","title":"名前を逆さまに言ってみる","chapter":"N","answer":"\\w+","ok":"たしまきでくよ","error":"","text":"

コンピュータが処理できる文字の集まりのことを文字列といいます。\n文字を一並びに干された洗濯物、引用符をその端をつまんでいる洗濯ハサミだと思ってください。\n引用符は文字列のはじめとおわりを表します。

\n\n

名前を逆さまにするには、つぎのように入力します。

\n\n
"Jimmy".reverse\n
\n\n

(ピリオドを忘れないで!)

\n","load_code":""}, "7":{"lang":"JA","title":"文字数を数える","chapter":"N","answer":"^\\d+$","ok":"そのとおり。lengthも'メソッド'です","error":"","text":"

名前を逆さまにする メソッド を使いました!\nまず名前を引用符でくくり、文字列を作りました。\nそして文字列のreverseメソッドを呼び出しました。\nreverseメソッドは文字列のすべての文字を逆さまにひっくりかえす動きをします。

\n\n

それでは次に、名前が何文字かを表示させてみましょう。

\n\n
"Jimmy".length\n
\n","load_code":""}, "8":{"lang":"JA","title":"繰り返す","chapter":"N","answer":"(\\w+)","ok":"こんにちわ。こんにちわ。こんにちわ。","error":"","text":"

文字数が数えられると、どんないいことがあるの?と疑問に思っているかもしれません。

\n\n

ええと、Webサイトで パスワードが短すぎます! と警告されたことがあるでしょう。

\n\n

そうした場面では、プログラムの中で .length メソッドが使われていることがあります。

\n\n

次に進みましょう。名前に5を掛けてみてください。

\n\n
"Jimmy" * 5\n
\n","load_code":""}, "9":{"lang":"JA","title":"このくらいで要約(その1)にしましょう","chapter":"Y","answer":"NoMethodError|undefined","ok":"いいえ、数を逆さまにはできません。'Next'を押してください","error":"","text":"

ここまでの数分で学んだことを確認してみましょう。

\n\n

エディタ

\n\n

エディタにコードを入力しRunを押すと、出力ウィンドウに結果が出力されます。\nほぼすべてのコードは、結果が表示されます。

\n\n

数値と文字列

\n\n

数値と文字列は、Rubyで計算やテキスト処理を行うためのオブジェクトです。

\n\n

メソッド

\n\n

reverseやlengthといった英語のメソッドを使いました。\nそれと、乗算メソッド(*)のような記号のメソッドも使いました。\nメソッドは振る舞いを意味します!

\n\n

ここまでやってきたことが学習の本質です。\nシンプルな物事を取り上げていじくり回すと、それらは新しい物事に変わります。\n快適に進められていますか?そうであるよう望みます。

\n\n

オーケー

\n\n

ちょっとだけ不快なことをしてみましょう。数を逆さまにしてみてください。

\n\n
40.reverse\n
\n","load_code":""}, "10":{"lang":"JA","title":"止めて!おかしくなってしまったの?","chapter":"N","answer":"^\\d{1,}$","ok":"逆さまにできるのは文字列だけです","error":"","text":"

40という数を逆さまにはできません。\nモニタを鏡に向けて持ち上げることができるかもしれませんが、数字を逆さまにするということは理にかなっていません。

\n\n

Rubyはエラーメッセージを投げます。Rubyは数値を逆さまにするメソッドがないことを伝えています。

\n\n

あるいは、数値をまず文字列に変換すると良いかもしれません。

\n\n
40.to_s.reverse\n
\n","load_code":""}, -"11":{"lang":"JA","title":"男の子とちがう女の子って","chapter":"N","answer":"\\[\\]","ok":"素晴らしい。これは空のリストです。","error":"","text":"

数値は文字列と異なります。

\n\n

Rubyでは任意のオブジェクトのメソッドを使用できますが、いくつかのメソッドは特定の種類でだけ動きます。\nけれど、Rubyの“to"メソッドを使えば、いつでもデータの種類を変換できます。

\n\n
    \n
  • to_s はデータを文字列(string)に変換します
  • \n
  • to_i はデータを整数(integer)に変換します
  • \n
  • to_a はデータを配列(array)に変換します
  • \n
\n\n

配列って何?!

\n\n

配列とはリストのことです。次のように、角かっこの対を入力してみてください。

\n\n
[]\n
\n","load_code":""}, +"11":{"lang":"JA","title":"男の子とちがう女の子って","chapter":"N","answer":"\\[\\]","ok":"素晴らしい。これは空のリストです。","error":"","text":"

数値は文字列と異なります。

\n\n

Rubyでは任意のオブジェクトのメソッドを使用できますが、いくつかのメソッドは特定の種類でだけ動きます。\nけれど、Rubyの"to"メソッドを使えば、いつでもデータの種類を変換できます。

\n\n
    \n
  • to_s はデータを文字列(string)に変換します
  • \n
  • to_i はデータを整数(integer)に変換します
  • \n
  • to_a はデータを配列(array)に変換します
  • \n
\n\n

配列って何?!

\n\n

配列とはリストのことです。次のように、角かっこの対を入力してみてください。

\n\n
[]\n
\n","load_code":""}, "12":{"lang":"JA","title":"一列に並んで","chapter":"N","answer":"^\\[([-\\.\\d]+)(\\s*,\\s*[-\\d\\.]+){3,}\\]$","ok":"バッチリです","error":"リストの4番目に数値を追加してください","text":"

リスト(配列)は決まった順序でものを格納します。

\n\n

ポップコーンを買うために一列に並ぶようなものです。\nあなたは誰かの後ろに並んでいて、前にいる人たちを脇に押しやろうとは夢にも思っていません。ですよね?\nそして、後ろに並んでいる誰かにあなたは目を光らせている。でしょう?

\n\n

次に示すのは、あなた専用のリストです。抽選番号のリストです。

\n\n
[12, 47, 35]\n
\n\n

このリストに数を1つ追加してください。\n35のあとにカンマを入力し、続いて数を入力します。\n空白を入力するかどうかは任意です。

\n","load_code":""}, "13":{"lang":"JA","title":"だれか手を挙げて","chapter":"N","answer":"^47$","ok":"オーケー","error":"","text":"

抽選番号のリストがあります。いちばん大きな値はどれでしょう?

\n\n

以下を試してみてください。

\n\n
[12, 47, 35].max\n
\n","load_code":""}, "14":{"lang":"JA","title":"リストをしまい込む","chapter":"N","answer":"^\\[(\\d+)(,\\s*\\d+){2,}\\]$","ok":"保存しました!","error":"","text":"

いい調子です。けれど、必要になるたびにリストを打ち直すのは気が滅入りますよね。

\n\n

ticketにリストを保存しましょう。次のようにします。

\n\n
ticket = [12, 47, 35]\n
\n","load_code":""}, @@ -16,16 +16,16 @@ "16":{"lang":"JA","title":"保存して、しまい込みました","chapter":"N","answer":"\\[12, 35, 47\\]","ok":"リストをソートしました","error":"","text":"

抽選番号をメモし、それをticketという名前の変数にしまい込みました。\nここで、変数の名前はjimmyslistのような別のものでも構いません。

\n\n

プログラミングとは、これからわかってくることだと思いますが、\nおおむね変数とうまくやるということです。

\n\n

次に抽選番号を整列させてみましょうか。どうです?

\n\n

やり方は次の通りです。

\n\n
ticket.sort!\n
\n\n

リストを整列(sort)しました。変数ticketはもう変わっています。\nsort!メソッドのさいごに、大きく目立つ感嘆符があるのに気づきましたか?\nRubyのメソッドは、しばしば変数の中身を変更してしまう時にこのように叫びます。\nですがこれは何てことはない、ただの印です。

\n","load_code":"ticket = [12, 47, 35]"}, "17":{"lang":"JA","title":"要素","chapter":"N","answer":"^(12|35|47)$","ok":"いいですね","error":"惜しい","text":"

抽選番号をticketという変数に格納していました。それを再び取り出すにはどうしたらよいでしょう?

\n\n

もっとも大きな数をmaxを使って取り出す方法はすでに確認しました。\n同じように、firstlastというメソッドを使えば、リストの最初(first)の要素や最後(last)の要素を取り出すことができます。\nけれど、特定の要素を取り出したい場合は?

\n\n

[ ]

\n\n

Rubyは対象の要素を指すのに角かっこ [ ] を使います。\n角かっこはRubyでよく使われます。\n対象を並べるために使われる道しるべのようなものです。\n角かっこは「___を探しています」と対象に照準を合わせることを意味します。

\n\n

すべての抽選番号を得るには、次のようにします。

\n\n
puts ticket[0]\nputs ticket[1]\nputs ticket[2]\n
\n\n

[0]、[1]、[2]を使ったのはどうしてでしょう?

\n\n

そして、なぜ[1]、[2]、[3]ではないのでしょう?\n禅か何かの影響?そうではありません。\nわたしたちコンピュータの使い手は、0から数え始めるものなのです。けっしてRubyに限ったことではありません。\nこの0オリジンの数え方はほとんどのプログラミング言語で使われています。

\n\n
\n

忘れていませんか: Copyボタンを使えば例のコードをエディタに貼り付けることができます。

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"JA","title":"要約(その2)がやって来ました","chapter":"Y","answer":"\\w+","ok":"韻を踏んでいますか?","error":"","text":"

では、ここまでの数分をどう過ごしたか確認しましょう。

\n\n

エラー

\n\n

数値や疑わしげなものを逆順にしようとした場合には、Rubyはエラーが起きたことを教えてくれます。

\n\n

配列

\n\n

配列とは、決まった順序でものを格納するためのリスト構造です。\n配列の作成の仕方と、配列から要素を取り出す方法を学びました。

\n\n

変数

\n\n

変数はものを保存し、それに名前を与えます。変数に何かを格納するには、\nticket = [14, 37, 18] のように等号を使います。

\n\n

2/8

\n\n

このチュートリアルは全部で8つの章から構成されています。\nここまでで全体の8分の2まで進んできました!そんな複雑じゃないでしょう?\nいい調子です。

\n\n

少し話題を変えましょう。ある変数に、あなたに向けたちょっとしたポエムを詰めておきました。\n次のように入力して、見てみてください。

\n\n
puts poem\n
\n","load_code":"poem = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, -"19":{"lang":"JA","title":"悲しいかな、トーストの詩が大嫌い","chapter":"N","answer":"(toast){0}","ok":"すばらしい","error":"まだトーストの匂いがします","text":"

ええ、大丈夫です。無理に好きになる必要はありません。お好きなようにハックしてください。\nトーストの代わりに、メロンや他の何かを使いましょう。\n新しい詩を確認するために、次のコードを試してください。

\n\n
poem.gsub("toast", "honeydew")\n
\n\n

gsubメソッドはグローバル置換(global substitute)の略です。\n上記はすべての“toast"を"honeydew"と置き換えます。

\n","load_code":"prev"}, -"20":{"lang":"JA","title":"構えて、狙って","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"オーケー。詩全体が逆順に変わりました。","error":"","text":"

ここで質問があります。\nこの詩を丸ごと逆順にしたらどうなるでしょうか?

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"19":{"lang":"JA","title":"悲しいかな、トーストの詩が大嫌い","chapter":"N","answer":"(toast){0}","ok":"すばらしい","error":"まだトーストの匂いがします","text":"

ええ、大丈夫です。無理に好きになる必要はありません。お好きなようにハックしてください。\nトーストの代わりに、メロンや他の何かを使いましょう。\n新しい詩を確認するために、次のコードを試してください。

\n\n
poem.gsub("toast", "honeydew")\n
\n\n

gsubメソッドはグローバル置換(global substitute)の略です。\n上記はすべての"toast"を"honeydew"と置き換えます。

\n","load_code":"prev"}, +"20":{"lang":"JA","title":"構えて、狙って","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"オーケー。詩全体が逆順に変わりました。","error":"","text":"

ここで質問があります。\nこの詩を丸ごと逆順にしたらどうなるでしょうか?

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"JA","title":"ひっくり返し過ぎました","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"いいですね、だいたい実現できました","error":"","text":"

句読点なども含めて、詩全体が逆順となってしまいました。\n本当は行の順序をひっくり返したかったのです。\n最後の行を最初に、最初の行は最後にするということです。

\n\n

行は逆順にしますが、文自体は逆順にしません

\n\n

どうやるかを次に示します。

\n\n
poem.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"JA","title":"メソッドをつなげる","chapter":"N","answer":"^More still did (.+)","ok":"いい感じですね!joinメソッドは、配列の各要素をつなげて、一つの文字列にしました。","error":"","text":"

何が確認できました?いったい何が起こりました?poem.lines.reverseと入力すると、何が起きたでしょう?

\n\n

2つのことが起きました。linesを使って、詩を行ごとのリストにしました。\nlinesは文字列を分解する方法を決定し、配列に変換します。

\n\n

では、さらにもう一つメソッドをつなげてみましょう。

\n\n
puts poem.lines.reverse.join\n
\n\n

このようにメソッドをつなげていくことを、メソッド連鎖といいます。

\n","load_code":"prev"}, +"22":{"lang":"JA","title":"メソッドをつなげる","chapter":"N","answer":"My toast has flown from my hand","ok":"いい感じですね!joinメソッドは、配列の各要素をつなげて、一つの文字列にしました。","error":"","text":"

何が確認できました?いったい何が起こりました?poem.lines.reverseと入力すると、何が起きたでしょう?

\n\n

2つのことが起きました。linesを使って、詩を行ごとのリストにしました。\nlinesは文字列を分解する方法を決定し、配列に変換します。

\n\n

では、さらにもう一つメソッドをつなげてみましょう。

\n\n
puts poem.lines.reverse.join\n
\n\n

このようにメソッドをつなげていくことを、メソッド連鎖といいます。

\n","load_code":"prev"}, "23":{"lang":"JA","title":"ここで、要約(その3)です","chapter":"Y","answer":"\\{\\}","ok":"空のハッシュを作成しました!","error":"","text":"

感嘆符

\n\n

メソッドには、名前に感嘆符(もしくは疑問符)がつくものがあります。\nそれらは、メソッドがどんな動きをするかを説明するためについているもので、どうということはありません。

\n\n

文字列操作

\n\n

文字列を検索し、置換しました。

\n\n

連鎖

\n\n

メソッド連鎖をすると、より多くのことを一気におこなえます。\n詩を分割し、逆順にし、ふたたび組み立てるために、poem.lines.reverse.joinとしました。

\n\n

もしかすると、もうちょっと詩をいじくってみたいですか?\nStringのすべてのメソッド一覧はここにあります。

\n\n

見に行ってみて、ちょっとだけ試してみてください。\npoem.downcaseやpoem.swapcaseなどをしてみると面白いかもしれません。

\n\n

準備はいいですか?

\n\n

次に行く準備が整ったら、次のように入力してください。

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"JA","title":"ちっちゃな空っぽの本","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"新しい書評です","error":"splendid、quite_good、mediocre、quite_not_good、abysmal
のいずれかを使ってください。また、コロンを忘れないでください","text":"

今作成したのは空のハッシュです。ハッシュは配列みたいなもので、各要素が名前を持つという点が異なります。

\n\n

新しいハッシュに簡易的な書評をいくつか詰め込んでみることにします。\n評価体系は次のとおりです。

\n\n
    \n
  • :splendid → とてもよい
  • \n
  • :quite_good → よい
  • \n
  • :mediocre → よい部分とひどい部分が半々
  • \n
  • :quite_not_good → よくない
  • \n
  • :abysmal → これはひどい
  • \n
\n\n

書籍を評価するために、角かっこの中に書名を置き、イコールの後に評価結果を置きます。\n以下に例を示します。

\n\n
books["Gravitys Rainbow"] = :splendid\n
\n\n
\n

TryRubyのすべてのレッスンが互いに独立していることについて、そろそろ触れないといけないでしょう。\nこのレッスンでものすごくたくさん書評を入力したとしても、それはこのレッスンでだけしか使えません。\nもし次のレッスンでも作成した書評を使いたいのなら、書評をコピーしておいて次のレッスンにてペーストしてください。\n心配しすぎなくても大丈夫です。レッスンを楽しめるように、各レッスンで必要となるものは、事前にきちんと定義されています。

\n
\n","load_code":"books = {}"}, "25":{"lang":"JA","title":"一口書評をもうちょっと","chapter":"N","answer":"[3-9]","ok":"lengthメソッドは文字列だけでなく、配列やハッシュでも使えます","error":"","text":"

つづけて書評を増やしていきましょう。\nすべてのリストを確認するには、puts books と入力します。

\n\n

繰り返しますが、評価体系は :splendid、:quite_good、:mediocre、:quite_not_good、:abysmal です。

\n\n

これらの評価は文字列ではありません。単語の前にコロンをつけると、それはシンボルになります。\nシンボルとは、コンピュータメモリの観点で、文字列よりもコストの安いものになります。\nもしプログラムの中で繰り返し繰り返し同じ単語を使いっていたら、シンボルを使うべきです。\nその単語の数千のコピーをメモリ上に持つのではなく、コンピュータは一度だけシンボルを格納します。

\n\n

もっと重要なことは、シンボルにすることは、それが適当な単語ではなく、プログラム中で意味があると示すことができるということです。

\n\n

書評を2つ以上入力したら、books.lengthを使ってハッシュの中に何この書評があるかを確認してみてください。

\n\n
books["The deep end"]  = :abysmal\nbooks["Living colors"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid}"}, "26":{"lang":"JA","title":"待って。Gravity's Rainbowは好きでしたっけ?","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"とても好きでした","error":"","text":"

Rubyがすばらしい点のひとつに、名前がしばしば再利用されるという点があります。\nこのおかげで、覚えておかないとならない名前は少なくなります。

\n\n

配列から要素を取り出す際は、puts ticket[1] のように数値を使う必要があったのを覚えてますか?

\n\n

ハッシュでも同様の方法で要素を取り出せます。ただし、数値ではなく名前を使用します。

\n\n

古い書評を調べたくなったとします。ふたたび角かっこに書名を入力しましょう。けれどイコールから後ろは含めないでください。\n次のようになります。

\n\n
puts books["Gravitys Rainbow"]\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre}"}, "27":{"lang":"JA","title":"ハッシュはペア","chapter":"N","answer":"^\\[\".*\"\\]","ok":"キーを取り出しました","error":"","text":"

気をつけないといけないことがあります。ハッシュは順序を保持しません。\nそれはハッシュの責務ではないからです。ハッシュはただ二つのものをペアにします。\nキーです。

\n\n

書評を詰め込んだハッシュで言うと、書名がキーで評価が値です。

\n\n

もし評価した書籍の書名だけをすべて確認したいだけなら、次のようにします。

\n\n
books.keys\n
\n\n

.keysの代わりに.valuesを試すこともできます。

\n","load_code":"prev"}, -"28":{"lang":"JA","title":"辛辣な書評をつけてしまった?","chapter":"N","answer":"\"mediocre\"","ok":"やった!すごいです。評価のスコアカードを作成しました","error":"","text":"

辛辣か不公平な書評をつけてしまいましたか?\nでは、ratingsという新しいハッシュを用意してスコアをつけていくようにしましょう。

\n\n

どうするかというと、そうですね、書評をカウントアップしていくことにします。以下を入力してください。

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

コード中の棒線はパイプ文字です。キーボードだと、Enterキーの上あたりにあるはずです。

\n\n

このコードの+= 1という行は、値を1増やすという意味になります。

\n\n

ここで起きていることをぜんぶ理解できないとしても、心配しないでください。\nあとで明らかにしていきます。

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, +"28":{"lang":"JA","title":"辛辣な書評をつけてしまった?","chapter":"N","answer":":mediocre","ok":"やった!すごいです。評価のスコアカードを作成しました","error":"","text":"

辛辣か不公平な書評をつけてしまいましたか?\nでは、ratingsという新しいハッシュを用意してスコアをつけていくようにしましょう。

\n\n

どうするかというと、そうですね、書評をカウントアップしていくことにします。以下を入力してください。

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

コード中の棒線はパイプ文字です。キーボードだと、Enterキーの上あたりにあるはずです。

\n\n

このコードの+= 1という行は、値を1増やすという意味になります。

\n\n

ここで起きていることをぜんぶ理解できないとしても、心配しないでください。\nあとで明らかにしていきます。

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, "29":{"lang":"JA","title":"数え上げる","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

たったいま使った、驚くべき新しい道具はブロックです。\nここから2つのレッスンでは、ブロックについて詳しく見ていくことにします。\n基本的に、ブロックとは中かっこでくくられたRubyのコード片のことです。

\n\n

では、別のブロックも試してみましょう。

\n\n
5.times { print "Odelay! " }\n
\n\n

ブロックは常にメソッドに渡されます。\ntimesメソッドのように、ブロックをとり、そのコード片を何回も実行したりします\n(上記の例は5回でした)。

\n","load_code":""}, "30":{"lang":"JA","title":"いまはいくつ?","chapter":"N","answer":"^[0-9]$","ok":"ちょうど良い回数、ブロックを実行しました!","error":"ブロックは0から9までの間で実行させてください","text":"

ブロックを使った最初の例(評価をカウントしたプログラムです)で見たように、ブロックには値を渡すことができます。\nどんな値が渡されるかは、ブロックを実行するメソッドによって決定されます。

\n\n

ブロックが受け取った値は、ブロックのはじめ、二つのパイプ文字(|)の間にある変数に置かれます。

\n\n

次のブロックを使ったコードを試してみてください。

\n\n
5.times { |time|\n  puts time\n}\n
\n\n

ここでは、.timesメソッドは変数|time|に値を送ります。\ntime変数はブロックの中でしか参照できないということに注意してください。

\n\n
\n

ブロックのコードを複数行に分けて書くことができることに気づきましたか?こうすると、ちょっとばかりコードを読みやすくできます。

\n
\n","load_code":""}, "31":{"lang":"JA","title":"要約(その4)にたどり着きました","chapter":"Y","answer":"","ok":"","error":"","text":"

最後のレッスンはちょっと長かったかもしれません。\n以下のことを学ぶのに、だいたい3分くらいかかったでしょうか。

\n\n

ハッシュ

\n\n

ねじれたページ{}を持つ小さな辞書です。

\n\n

シンボル

\n\n

とても小さく効率的なコードで、:splendidのようにコロン付きの単語で表します。

\n\n

ブロック

\n\n

多くのRubyのメソッドに付け加えることができるコード片です。\nスコアカードを組み立てるために使ったコードは、次のようなものでした。\nbooks.values.each { |rate| ratings[rate] += 1 }

\n\n

\n\n

次のレッスンではメソッドの内部についてもう少し深く掘り下げていこうと思います。

\n","load_code":""}, @@ -35,8 +35,8 @@ "35":{"lang":"JA","title":"作成した熟成フルーツ","chapter":"N","answer":"^じゃじゃ馬をならしました","ok":"飼いならされたじゃじゃ馬たちです","error":"","text":"

新しいメソッドが誕生しました。さっそく使ってみましょう。

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"じゃじゃ馬をならしました\"};end;"}, "36":{"lang":"JA","title":"ギブアンドテイク","chapter":"N","answer":"\\d+","ok":"いいです!ブラボー","error":"","text":"

ほとんどのメソッドは、入力として複数のパラメータを必要とするだけでなく、何かしらの値を戻します。\n先ほどのメソッドを少し変更して、戻り値を返すようにしました。以下を試してみてください。

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

return

\n\n

ここまでだいぶ先に進んできて、いろいろわかるようになってきたかと思います。ですので、ここではもう一つ別のヒントを出すことにしましょう。\n上記のメソッドからはreturnという単語は省略できます。\nRubyはメソッド内で評価された最後の値を自動的に返します。

\n\n

ですので、わたしたちは最後の行をnumber_of_shrewsのように変更できます。

\n\n

なのですが、実は.timesメソッドもまたnumber_of_shrewsを返すので、最後の行をまったく取り除いてしまうことも可能です。つまり、実際には最初の実装でやりたかったことはすべてできてしまっていたのです!

\n","load_code":""}, "37":{"lang":"JA","title":"やあ、誰がいますか?要約(その5)が帽子を振っています","chapter":"Y","answer":"","ok":"","error":"","text":"

よくやりました、よくやりました、よくやりました!

\n\n

ほんとうに、ほんとうに、ほんっとおぉぉぉぉぉに!

\n\n

人生のもっとも直近の数分であなたがやったことを、ここでおさらいしましょう。

\n\n

メソッド

\n\n

メソッドはdefのあとに名前を続けて定義します。\nメソッドはプログラムを短く、読みやすくできます。

\n\n

引数

\n\n

メソッドは引数を持てます。

\n\n

戻り値

\n\n

メソッドは(だいたいの場合)値を返します。

\n\n

\n\n

生きるべきか死ぬべきかはもう疑問ではなくなりました。\nシェイクスピアをもっと読む準備はできましたか?

\n","load_code":""}, -"38":{"lang":"JA","title":"世界はあなたの思いのまま","chapter":"N","answer":"^\\{\\\"William","ok":"いいですね。けれど少しばかり読みにくいです。","error":"","text":"

ここまでは、自分自身で入力したものだけを使用するプログラムを実行してきました。\nそのことはよいのですが、それは言わば古い時代にあった叙事詩のようなものです。\nけれど、今はインターネット時代です。\nプログラミングの成果に、世界の残りを含めてもいい時代です。

\n\n

わたしたちは、とてもとてもたくさんのWebサイトを利用して、情報を要求することができます。\nたとえば、このリンクからはRubyに関する現在のGoogleニュースフィードが手に入ります。

\n\n

Webブラウザは、おそらくとても良い感じにそれを表示してくれるでしょう。\nソースを表示したならば、奇妙にフォーマットされたテキストの長い文字列を確認できるはずです。\n先ほどのGoogleニュースフィードの例であれば、それはrssフォーマットというものになります。

\n\n

フォーマット(形式)

\n\n

Web上には、変わった名前を持ったとてもたくさんのフォーマットが存在し、利用されています。\nたとえば、htmlやxml、jsonといったフォーマットがあります。\nそうです、まさにこのWebサイトでも、これらのフォーマットを使用しています。

\n\n

試しに、インターネット上からウィリアム・シェイクスピアの全著作のリストを取得してくるメソッドを用意しました\n(実際にはこのWebサイトをホストしているサーバ上から取得してくるようにしています。誰にも迷惑はかかりませんので、ご安心ください)。

\n\n

データを取得するには、次のようにします。

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, -"39":{"lang":"JA","title":"二人の貴公子","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"たいへんよいです","error":"","text":"

いいですね。インターネットから戯曲のリストを取得できました。リストはjsonフォーマットになっていました。\n幸いなことに、RubyはjsonデータをRubyのハッシュに変換するメソッドを提供しています。\n今回は、getshakey_メソッドがすでにそれをやってくれていました。

\n\n

ただ、ハッシュにはなりましたが、jsonデータの構造を保ち続けているためにちょっとばかり読みにくいです。\n戯曲のリストをいい感じに表示するメソッドを書いていきましょう。

\n\n

注意深く戯曲のリストを確認してみると、それがある種のネスト構造を持っていることに気がつくでしょう\n(こうしたことはインターネットから取得するデータには実際よくあることです)。以下のような感じです。

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Veron”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

戯曲をリストにするために、まずいちばん上の“William Shakespeare” というハッシュ要素に、名前を指定してアクセスする必要があります。\n次に、そこから下の要素を繰り返していきます。

\n\n

Rubyには繰り返していくためのメソッドがあります。それがeachメソッドです。\nこのメソッドは書評システムを作成したときにも使いました。

\n\n

eachメソッドが返すものはすべて、次のようにブロックに渡されます。

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, +"38":{"lang":"JA","title":"世界はあなたの思いのまま","chapter":"N","answer":"^\\{\\\"William","ok":"いいですね。けれど少しばかり読みにくいです。","error":"","text":"

ここまでは、自分自身で入力したものだけを使用するプログラムを実行してきました。\nそのことはよいのですが、それは言わば古い時代にあった叙事詩のようなものです。\nけれど、今はインターネット時代です。\nプログラミングの成果に、世界の残りを含めてもいい時代です。

\n\n

わたしたちは、とてもとてもたくさんのWebサイトを利用して、情報を要求することができます。\nたとえば、このリンクからはRubyに関する現在のGoogleニュースフィードが手に入ります。

\n\n

Webブラウザは、おそらくとても良い感じにそれを表示してくれるでしょう。\nソースを表示したならば、奇妙にフォーマットされたテキストの長い文字列を確認できるはずです。\n先ほどのGoogleニュースフィードの例であれば、それはrssフォーマットというものになります。

\n\n

フォーマット(形式)

\n\n

Web上には、変わった名前を持ったとてもたくさんのフォーマットが存在し、利用されています。\nたとえば、htmlやxml、jsonといったフォーマットがあります。\nそうです、まさにこのWebサイトでも、これらのフォーマットを使用しています。

\n\n

試しに、インターネット上からウィリアム・シェイクスピアの全著作のリストを取得してくるメソッドを用意しました\n(実際にはこのWebサイトをホストしているサーバ上から取得してくるようにしています。誰にも迷惑はかかりませんので、ご安心ください)。

\n\n

データを取得するには、次のようにします。

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, +"39":{"lang":"JA","title":"二人の貴公子","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"たいへんよいです","error":"","text":"

いいですね。インターネットから戯曲のリストを取得できました。リストはjsonフォーマットになっていました。\n幸いなことに、RubyはjsonデータをRubyのハッシュに変換するメソッドを提供しています。\n今回は、getshakey_メソッドがすでにそれをやってくれていました。

\n\n

ただ、ハッシュにはなりましたが、jsonデータの構造を保ち続けているためにちょっとばかり読みにくいです。\n戯曲のリストをいい感じに表示するメソッドを書いていきましょう。

\n\n

注意深く戯曲のリストを確認してみると、それがある種のネスト構造を持っていることに気がつくでしょう\n(こうしたことはインターネットから取得するデータには実際よくあることです)。以下のような感じです。

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Veron”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

戯曲をリストにするために、まずいちばん上の"William Shakespeare" というハッシュ要素に、名前を指定してアクセスする必要があります。\n次に、そこから下の要素を繰り返していきます。

\n\n

Rubyには繰り返していくためのメソッドがあります。それがeachメソッドです。\nこのメソッドは書評システムを作成したときにも使いました。

\n\n

eachメソッドが返すものはすべて、次のようにブロックに渡されます。

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"JA","title":"すべてを一緒に","chapter":"N","answer":"^4$","ok":"そうです。シェイクスピアは1591年に4つの戯曲を書きました","error":"1591年の答えは4になります","text":"

ここで、ある年にシェイクスピアによって書かれた戯曲の数と名前のリストだけを知りたいとします。

\n\n

Rubyでは、ハッシュから値を選び出す(select)ことができます。\nselectメソッドは、選び出す条件をブロックとして渡すと、条件に該当した値のリストを返します。

\n\n

selectブロックのあとにそのままeachブロックをつなげることで、\nselectメソッドから返ったリストを使い、eachメソッドを呼ぶことができます。\nこれはメソッド連鎖の別の例です。メソッド連鎖については、詩をひっくり返す際に軽くお話ししました。

\n\n

上記を行うcount_playsメソッドを用意しました。\n以下のコードをもとに、1591年にシェイクスピアによってどのくらいの数の戯曲が書かれたかを調べてみてください。

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

countメソッドをeachメソッドの終わりにつなげていることに気づきましたか?\nこの値がcount_playsメソッドの戻り値になります。

\n\n

メソッド連鎖のまた別の具体例を示します。s = getshakey__ という行を見てみてください。\nここで、getshakeyのうしろに[“William Shakespeare”].select { |k, v|_ と続けることもできます\n(この場合はドットは付けないでください)。

\n","load_code":"prev"}, "41":{"lang":"JA","title":"終わりよければ全てよし","chapter":"N","answer":"All's Well That Ends Well","ok":"確かに","error":"2つ目の引数に1605を与えてください","text":"

いくつかのデータをインターネットから取得し、そこから欲しいものを選び出して出力しました。\nもっとよくするには、あと何が残っているでしょう?結果の表示をもう少しよくするとよいでしょうか。\nたとえば年を追加して、書名と年を揃えて表示するのはどうでしょう。

\n\n

これは、いくつかの値を1行に表示するということです。\nRubyにはそれをするためのきちんとした方法があります。\nputs “Hi, my name is Jimmy”のように、単なる文字列を表示するようなものです。\nですが、文字列リテラルJimmyの代わりに、変数の値を使います。

\n\n

まずJimmy#{}に置き換えます。Rubyは波かっこがつづく#を見た場合は、{ かっこの中に変数を探します } 。つまり、次のように書くことができます。“Hi, my name is #{name}”

\n\n

では、コードを少しばかり変更しましょう。

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

書名に.ljust(30)を追加しました。これによって書名は30文字の長さのなかで左寄せ(left justified)され、年の表示位置がいいかんじに整列されます。

\n\n

プログラムの出力が変更したことを確認したら、戯曲を表示する箇所を次のように変更してください。1600 -> あなたの好きな値

\n\n

終わりよければ全てよし?いいえ、まだおしまいではありません。けれど、それはもう目前です!

\n","load_code":"prev"}, "42":{"lang":"JA","title":"意思決定の仕方について知っている唯一のこと","chapter":"N","answer":"","ok":"","error":"","text":"

意思決定、それは実際の暮らしでは実に厄介な問題です。まあ、私たちにとっては、そうでもないですが。\nRubyはいとも簡単に意思決定を行います。

\n\n
if 1 < 2\n  puts "真: 1は2より小さい"\nend\n
\n\n

ここで鍵となる単語はifです。ifは、メソッドの前に配置することもできれば、\n次のように後ろにも配置できます。

\n\n
puts "真: 1は2より小さい" if 1 < 2\n
\n\n

ifは引数を1つ持つメソッドです。その引数で、どんな任意の式もテストできます。\n式の結果はかならずtrue(真)false(偽)でなければなりません。\n次に、こうした結果となるいくつかの式の例を示します。

\n\n
5     <= 10     # => true\n'abc' == 'def'  # => false\ntrue            # => true\n123456          # => true\n0               # => true\nnil             # => false\n'xyz'.empty?    # => false\n'a' > 5         # => エラー:\n                # 文字列と数値は比較できません\n
\n\n

if式は多くの形を取ることができます。リテラルの値同士(1 < 2)を比較できます。\nまた、変数同士(a < 1)を比較できます。\nそして、メソッドの戻り値('xyz’.empty?)も扱えます。

\n","load_code":""}, @@ -47,7 +47,7 @@ "47":{"lang":"JA","title":"アプリを作るもの","chapter":"N","answer":"","ok":"","error":"","text":"

新しくBlurbTMクラスを開きました。\nブログエントリは一体何で作られるでしょう?そうです、コンテンツです。\nそれからBlurbTMが投稿された時刻、そして気分も必要でしょう。

\n\n

先ほどはクラスの最初の行を用意しました。以下が残りの部分になります。

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

クラス名は常に大文字から始まります。

\n\n

(まだ何も出力しません)

\n","load_code":""}, "48":{"lang":"JA","title":"アクセサはぶらぶらとした手","chapter":"N","answer":"Blurb:","ok":"はじめての手","error":"","text":"

なかなか素質がありますね。これで、新しいBlurbTMクラスを手に入れました。

\n\n

クラス定義の中で、attr_accessorと呼ばれるメソッドを使いました。\nこうした属性(attribute)メソッドの多くは、クラスにわずかばかりの設定を加えます。\nこれらの属性は、ちょうどクラスに付属する変数のようなものです。

\n\n

これがどういうことかを考えてみます。\nクラスは人のようなものです。星型の人を想像してください。\nそして属性は、体を構成し他の人との握手も可能にする、ぶらぶらとした手です。

\n\n

ここから

\n\n

BlurbTMを生成して、コンテンツを設定するために、以下のようにしてください。

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"JA","title":"オブジェクトとは、キチンとした小さなパッケージ","chapter":"N","answer":"Blurb:","ok":"Blurbを更新しました","error":"","text":"

先に進み、BlurbTMに時刻と気分を設定してください。

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"JA","title":"ペースを速めて","chapter":"N","answer":"^\\d{4}","ok":"記録されました","error":"","text":"

いい感じです。じゃあ、ちょっとだけ軽く何か作ってみましょう。\nBlurbTMするごとに毎回時間を設定したくはないでしょう。

\n\n

内容の入力と気分の選択だけしたいですよね?

\n\n

initializeメソッドをクラスに追加しましょう。\nこのメソッドは新しいBlurbTMがつくられるたびに呼び出されます。\n同時に、BlurbTMの内容を40文字に制限することもできます。

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(引数のcontent=“”という部分は、内容が文字列であると確認するためにあります。\nこう書くことで、たとえcontent部分の引数が与えられなったとしても空文字が渡されます。)

\n","load_code":""}, +"50":{"lang":"JA","title":"ペースを速めて","chapter":"N","answer":"^\\d{4}","ok":"記録されました","error":"","text":"

いい感じです。じゃあ、ちょっとだけ軽く何か作ってみましょう。\nBlurbTMするごとに毎回時間を設定したくはないでしょう。

\n\n

内容の入力と気分の選択だけしたいですよね?

\n\n

initializeメソッドをクラスに追加しましょう。\nこのメソッドは新しいBlurbTMがつくられるたびに呼び出されます。\n同時に、BlurbTMの内容を40文字に制限することもできます。

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(引数のcontent=“”という部分は、内容が文字列であると確認するためにあります。\nこう書くことで、たとえcontent部分の引数が与えられなったとしても空文字が渡されます。)

\n","load_code":""}, "51":{"lang":"JA","title":"意味ないものは拒むようにしつけました","chapter":"N","answer":"Blurb:","ok":"Blurbが追加されました","error":"","text":"

クラスの内側がどうなっているかを確認し、アットマークが付いたシンボル(@time)を使いました。

\n\n

クラスの外側では、アクセサを使います。

\n\n
\n

blurb.time = Time.now

\n
\n\n

ですが、内側ではオブジェクトの変数を使います。

\n\n
\n

@time = Time.now

\n
\n\n

これらは実際には同じことです。しかしプログラムの2つの異なる場所では異なる表現を使います。

\n\n

別のBlurbTMを作る

\n\n

新しいBlurbTMを作成すると、initializeメソッドは新しい任意の引数用に使われます。

\n\n

あ、2つの引数が必要です。

\n\n
Blurb2 = Blurb.new :confused, "I can not believe Mt. Hood was stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"JA","title":"キリンは要約(その7)を盗みません","chapter":"Y","answer":"","ok":"","error":"","text":"

やっと、ここまできました。すべてを1つにしました。まだアプリを現実に近づけるつもりですが、その前にやったことを振り返りましょう。いいですか?

\n\n

クラス

\n\n

Rubyのすべてはオブジェクトです。クラスはオブジェクトを説明するもので、特定のオブジェクトがどう動くかを説明します。\n例えば、いくつか新しいBlurbTMオブジェクトを作成したとすると、それらのオブジェクトはクラスによって説明されたということです。\nつまり、それらはBlubオブジェクトです。\nクラスを(ある種)現実世界のオブジェクトのモデルとして使うことができます。

\n\n

アクセサ

\n\n

アクセサは、オブジェクトのから使うことのできる、オブジェクトに付けられた変数です。\n(blurb2.time = Time.now)

\n\n

オブジェクトの変数

\n\n

オブジェクト変数はアクセサで触れる変数と同じです。けれど、オブジェクトの内側にあります。\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"JA","title":"あなた自身の芝","chapter":"N","answer":"Blurbalizer:","ok":"アプリが作られました","error":"","text":"

さて、全部をまとめ上げましょう。ここからがTry Rubyの魅惑的な壮大なストーリーの最後の章です!\n今やあなたはすべての機能を堪能しました。\n家の周りやあなたが経営する食料品店の冷蔵庫の中で、どうそれを使うつもりですか?\nあなたは(私のお気に入りの)偉大な人物ではありますが、ガイドは必要です。

\n\n

アプリケーションを完成させましょう

\n\n

あなたはアプリの要素は持っています。\nけれど実際のアプリではありません。\nタイトルやすべてのBlurbsTMを格納する場所、順序通りのタイムラインなどが必要です。

\n\n

推測したとおり、これから新しい別のクラスを作ります。\n新しいクラスのためのコードを全て一度に提供します。\nぜんぜん勉強に時間をかけてかまいませんよ。\n私は急ぎませんよ。次のレッスンにあなたが来るのを待っています。

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # A fresh clean array\n                 # for storing Blurbs\n  end\n\n  def add_a_blurb(mood, content)\n    # The << means add to the end of the array\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/source/try_ruby_mk.json b/source/try_ruby_mk.json index 65e34ee7..84df1543 100644 --- a/source/try_ruby_mk.json +++ b/source/try_ruby_mk.json @@ -17,15 +17,15 @@ "17":{"lang":"MK","title":"Елементарно","chapter":"N","answer":"^(12|35|47)$","ok":"ОК","error":"Скоро до целта","text":"

Па, ги зачувавме нашите лото броеви во променливата ticket. Како сега да ги извадиме повторно надвор?

\n\n

Веќе видовме дека можеме да го извадиме најголемиот број од низата со методот max. Слично, можеш да \nго извадиш првиот или последниот елемент од низата.\nНо, што ако сакаш да извадиш некој конкретен елемент?

\n\n

[ ]

\n\n

Ruby користи [ ] загради за да таргетира елемент.\nЗаградите се многу чести во Ruby.\nТие се како знаци кои се користат за да пронајдеш мета. Буквално.\nТие загради значат, “Јас барам ____”. Подготвен, нишани!

\n\n

Ајде да ги издвоиме сите лото броеви:

\n\n
puts ticket[0]\nputs ticket[1]\nputs ticket[2]\n
\n\n

Зошто користиме [0], [1], [2]?

\n\n

А не користиме [1], [2] и [3]? Да не е ова некаква Јапонска Зен работа?\nНе, ние компјутерџиите сакаме да започнеме со броење од нула. Тоа всушност не е само во Ruby,\nиндексирањето базирано на нула се користи во повеќето програмски јазици.

\n\n
\n

Мало потсетување: можeш да го користиш Copy копчето за да го копираш код примерокот во едиторот.

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"MK","title":"Резимето на делот #2 е тука","chapter":"Y","answer":"\\w+","ok":"Се римува ли?","error":"","text":"

Сега, погледни како твојата втора минута помина:

\n\n

Грешки (анг. Errors)

\n\n

Доколку пробаш да прикажеш број во обратен редослед или да направиш нешто некоректно, Ruby ќе ти укаже на тоа.

\n\n

Низи (анг. Arrays)

\n\n

Низите се листи кои зачувуваат работи во некаков редослед.\nЗнаеме како да креираме низа и како да извадиме елементи од низата.

\n\n

Променливи (анг. Variables)

\n\n

Променливите зачувуваат работи и им даваат име. Го употреби знакот за еднакво за да го направиш тоа. На пример,\nticket = [14, 37, 18].

\n\n

2/8

\n\n

Сѐ на сѐ има 8 секции. Ти си две-осмини од целта. Ова се прилично едноставни работи, нели? \nУште подобри работи следат!

\n\n

Ајде да смениме насока за момент. Зачував поезија за тебе во одредена променлива.\nПогледни. Напиши:

\n\n
puts poem\n
\n","load_code":"poem = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, "19":{"lang":"MK","title":"За жал, Toast поезијата не ти се допаѓа","chapter":"N","answer":"(toast){0}","ok":"Прекрасно","error":"Сеуште ми мириса на toast мене","text":"

Види, во ред е. Не мора да ти се допаѓа. Промени го, ако баш и сакаш. Наместо toast, оди по \nлубеница или нешто друго. Пробај го следново за да ја видиш новата поема:

\n\n
poem.gsub("toast", "honeydew")\n
\n\n

gsub методот е скатено за глобална замена (анг. global substitute). Ги заменува сите прикажување на “toast” со\n“honeydew”.

\n","load_code":"prev"}, -"20":{"lang":"MK","title":"Подготвен, нишани","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"Во ред. Целата поема е прикажана во обратен редослед.","error":"","text":"

Прашање: што ќе се случи кога ќе ја прикажеме во обратен редослед целата поема?

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"MK","title":"Подготвен, нишани","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"Во ред. Целата поема е прикажана во обратен редослед.","error":"","text":"

Прашање: што ќе се случи кога ќе ја прикажеме во обратен редослед целата поема?

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"MK","title":"Премногу пресврти","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"Да, скоро до тоа што го посакуваме","error":"","text":"

Значи, целата поема е прикажана во обратен редослед, буква по буква. Јас само сакав да ги прикажам \nредиците во обратен редослед.\nДа ги променам местата на последната редица со првата.

\n\n

Да наназад, но не толку назад.

\n\n

Еве како:

\n\n
poem.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"MK","title":"Прстени од врзување на методи","chapter":"N","answer":"^More still did (.+)","ok":"Добра претстава, мој пријателе!
join методот ја зеде низата од редици стихови и ги спои сите заедно во стринг.","error":"","text":"

Па, што гледаш? Што се случи таму? Ти напиша poem.lines.reverse и што се случи?

\n\n

Се случија две работи. Ти ја претвори поемата во низа со помош на редовите стихови.\nРедовите стихови одлучија на кој начин стрингот ќе биде поделен и го претвори во Низа.

\n\n

Потоа, ја прикажа низата во обратен редослед. Ја имаше секоја редица стих. Ги прикажа во обратен редослед. И, тоа е тоа.

\n\n

Ајде да додадеме уште еден метод на крајот:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбинирањето, односно врзувањето на методи на ваков начин е наречен method chaining.

\n","load_code":"prev"}, +"22":{"lang":"MK","title":"Прстени од врзување на методи","chapter":"N","answer":"My toast has flown from my hand","ok":"Добра претстава, мој пријателе!
join методот ја зеде низата од редици стихови и ги спои сите заедно во стринг.","error":"","text":"

Па, што гледаш? Што се случи таму? Ти напиша poem.lines.reverse и што се случи?

\n\n

Се случија две работи. Ти ја претвори поемата во низа со помош на редовите стихови.\nРедовите стихови одлучија на кој начин стрингот ќе биде поделен и го претвори во Низа.

\n\n

Потоа, ја прикажа низата во обратен редослед. Ја имаше секоја редица стих. Ги прикажа во обратен редослед. И, тоа е тоа.

\n\n

Ајде да додадеме уште еден метод на крајот:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбинирањето, односно врзувањето на методи на ваков начин е наречен method chaining.

\n","load_code":"prev"}, "23":{"lang":"MK","title":"Од вкупниот број на Резимеа, #3 е тука","chapter":"Y","answer":"\\{\\}","ok":"Одлично! Ти направи празен hash!","error":"","text":"

Извичници

\n\n

Методите можат да содржат извичници (и прашалници) во нивното име.\nТоа е само заради подобро објаснување на нивната функционалност. Ништо страшно.

\n\n

Манипулација на стрингови

\n\n

Пребарување и промена на стрингови

\n\n

Поврзување (анг. chaining)

\n\n

Поврзувањето на методи помага кога треба да извршиш повеќе операции врз еден објект. Можеш: да ја поделиш поемата, да ја прикажеш во обратен редослед, и на крај па пак да ја склопиш:\npoem.lines.reverse.join

\n\n

Во овој момент, можеби сакаш уште да си играш со поемата. Комплетната листа со методи за \nманипулација со Стрингови можеш да ја најдеш тука.

\n\n

Повели и пробај нови методи, како на пример: poem.downcase или poem.swapcase

\n\n

Подготвен?

\n\n

Кога ќе се почувствуваш спремен за следната лекција, напиши:

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"EN","title":"Мала празна книга","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Да, ти само што додаде нов ранг","error":"Use one of splendid, quite_good, mediocre, quite_not_good, abysmal.
Don't forget the colon","text":"

Креираше празен hash. Нash-от е како низа, со таа разлика што секој од елементите во hash-от има име.

\n\n

Ќе направиме минијатурни оцени за книгата во нашиот нов hash. Ова е нашиот систем за рангирање:

\n\n
    \n
  • :splendid → ремек-дело
  • \n
  • :quite_good → релативно добра
  • \n
  • :mediocre → ист број на добри и лоши делови
  • \n
  • :quite_not_good → релативно лоша
  • \n
  • :abysmal → премногу лоша
  • \n
\n\n

За да рангираш книга, стави го насловот во [ ] наводници и стави го рангот после знакот за еднакво. На пример,

\n\n
books["Gravitys Rainbow"] = :splendid\n
\n\n
\n

Бидејќи стигна до тука, фер е да ти кажам дека сите лекции во TryRuby се одвоени една од друга.\nПа така, ако се разигра со рангирањето на книги, шансата ти е само во оваа лекција.\nДоколку сакаш да ги користиш твоите рангирања во наредната лекција, мораш да им направиш copy/paste.\nНе грижи се за ова премногу, секоја лекција има многу предефинирани работи со кои можеш да играш.

\n
\n","load_code":"books = {}"}, "25":{"lang":"MK","title":"Уште оцени!","chapter":"N","answer":"[3-9]","ok":"Само што откри дека методот length одговара за стрингови, низи и hash-ови","error":"","text":"

Продолжи со одличната работа и наполни ги книгите со оцени. И, ако сакаш да ја видиш целата листа само напиши: puts books

\n\n

И повторно, рангирањето е: :splendid, :quite_good, :mediocre, :quite_not_good and :abysmal.

\n\n

Овие рангови не се стрингови. Кога ќе ставиш две-точки : пред прост збор, добиваш симбол.\nСимболите се „поевтини“ од стринговите (во конотација на компјутерска меморија). Доколку сакаш да користиш еден збор на повеќе места во твојата програма, користи симбол. Наместо да имаш илјадници копии од истиот збор во меморија, компјутерот ќе го зачува симболот само еднаш.

\n\n

Уште поважно, симболот ти кажува дека не е само било кој стар збор, туку има значење во твојата програма.

\n\n

Внеси уште 2 оцени за книги, и напиши books.length за да видиш колку оцени има во hash-от:

\n\n
books["The deep end"]  = :abysmal\nbooks["Living colors"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid}"}, "26":{"lang":"MK","title":"Чекај малку, ја оценив ли книгата Gravity's Rainbow?","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Многу ми се допаѓа","error":"","text":"

Една од прекрасните работи во Ruby е тоа што имињата се често повторно употребливи, а тоа значи помалку имиња за паметење.

\n\n

Се сеќаваш ли како издвојувавме елементи од низа, со користење на број:
\nputs ticket[1].

\n\n

Кај hash-от ова фунцкионира на ист начин, со таа разлика што кај hash-от не користиме број за да го издвоиме елементот, туку користиме име.

\n\n

Па така, ако сакаш да издвоиш некој од твоите постари оцени, повторно стави го насловот во [ ] наводници. Но, изостави го знакот за еднакво.\nИсто како во примерот:

\n\n
puts books["Gravitys Rainbow"]\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre}"}, "27":{"lang":"MK","title":"Hash-овите како Парови","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Ги пронајде клучевите","error":"","text":"

Имај на ум дека hash-овите не ги чуваат работите во редослед. Тоа не е нивна работа. Нивната работа е \nсамо да направат пар од две работи: клуч (анг. key) и вредност (анг. value).

\n\n

Во твоите оцени, името на книгата претставува клуч, а рангот претставува вредност.

\n\n

Доколку сакаш да ги видиш само насловите од сите книги што си ги оценил, напиши:

\n\n
books.keys\n
\n\n

Можеш да го пробаш истово и со .values, наместо со .keys.

\n","load_code":"prev"}, -"28":{"lang":"MK","title":"Дали си строг при оценувањето на книгите?","chapter":"N","answer":"\"mediocre\"","ok":"Одлично, браво! Ти само што направи карта со твои оцени.","error":"","text":"

Даваш строги, нефер оцени? Ајде, да го зачуваме резултатот во нов hash ratings:

\n\n

Потоа, може да ги изброиме твоите оцени. Остани со мене. Напиши:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Правата линија во кодот се вика pipe character, која најверојатно се наоѓа над копчето Enter\nна твојата тастатура.

\n\n

Делот += 1 од код линијата ratings[rate] += 1 значи: зголеми ја вредноста за 1.

\n\n

Не грижи се ако не разбираш сѐ што се случува тука. Ќе ти биде јасно подоцна.

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, +"28":{"lang":"MK","title":"Дали си строг при оценувањето на книгите?","chapter":"N","answer":":mediocre","ok":"Одлично, браво! Ти само што направи карта со твои оцени.","error":"","text":"

Даваш строги, нефер оцени? Ајде, да го зачуваме резултатот во нов hash ratings:

\n\n

Потоа, може да ги изброиме твоите оцени. Остани со мене. Напиши:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Правата линија во кодот се вика pipe character, која најверојатно се наоѓа над копчето Enter\nна твојата тастатура.

\n\n

Делот += 1 од код линијата ratings[rate] += 1 значи: зголеми ја вредноста за 1.

\n\n

Не грижи се ако не разбираш сѐ што се случува тука. Ќе ти биде јасно подоцна.

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, "29":{"lang":"MK","title":"Сума","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

Една од прекрасните нови работи кои сега ги искористивме е блокот (анг. block). Ќе дознаеш повеќе за ова и во следната лекција. Но, во основа, блокот е мал Ruby код опкружен со { } наводници.

\n\n

Ајде да пробаме друг блок:

\n\n
5.times { print "Odelay! " }\n
\n\n

Блоковите се секогаш поврзани за методи. Како кај times методот, кој го зема блокот и го извршува\nодново и одново. (Во нашиот пример, пет пати.)

\n","load_code":""}, "30":{"lang":"MK","title":"Дали имаш уште време?","chapter":"N","answer":"^[0-9]$","ok":"Одлично го примени .times методот!","error":"Изврши го кодот во блокот 0 до 9 пати","text":"

Како што видовме во првиот пример со блок (при броењето на рангови) може да испратиш вредност (анг. value) на блокот. \nКои вредности се испратени е одредено со методот кој го управува блокот.

\n\n

Вредностите кои се примени од блокот се сместени во променлива, која се испраќа на почетокот на блокот,\nпомеѓу два симболи: |име на променлива|

\n\n

Ајде да го пробаме тоа во следниов блок:

\n\n
5.times { |time|\n  puts time\n}\n
\n\n

Тука, методот .times праќа вредност на променливата |time|. При тоа, запомни дека променливата time е валидна само \nво рамки на блокот.

\n\n
\n

Примети ли дека можеш да го делиш кодот на повеќе линии. Тоа го прави полесен за читање.

\n
\n","load_code":""}, "31":{"lang":"MK","title":"Стигнавме до Резиме #4","chapter":"Y","answer":"","ok":"","error":"","text":"

Последнава лекција беше малку подолга. Најверојатно ти требаа три минути за да научиш:

\n\n

Hash-ови

\n\n

Синоним за малиот речник (анг. dictionary) со округли страни: { }

\n\n

Симболи (анг. symbols)

\n\n

Мал, ефективен код од зборови, пред кои се ставаат две-точки, како: :splendid

\n\n

Блокови (анг. blocks)

\n\n

Делови код кој може да се прикачи на многу методи во Ruby. Следниот код го искористи за да го зачуваш резултатот: \nbooks.values.each { |rate| ratings[rate] += 1 }

\n\n

Следно

\n\n

Во следната лекција ќе учиме подетално за методи.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"MK","title":"Зрелите плодови на твојата креација","chapter":"N","answer":"^Tamed a shrew","ok":"That'll show those shrews","error":"","text":"

Нов метод е дефиниран. Ајде сега да го примениме:

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"Tamed a shrew\"};end;"}, "36":{"lang":"MK","title":"Дај и земи","chapter":"N","answer":"\\d+","ok":"Само така. Браво.","error":"","text":"

Повеќето методи не само што бараат некои параметри како инпут (анг. input), туку и ќе дадат нешто назад.\nНаправив мала измена во методот со цел да ти врати некоја вредност. Пробај:

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

Return

\n\n

Па, бидејќи си толку способен и напреден, повели уште еден совет:\nможеш да го испуштиш клучниот збор return од последната линија код во методот.\nRuby автоматски ќе ја врати последната вредност што се употребила во методот.

\n\n

Па така, последната линија код може да се прикаже вака: number_of_shrews.

\n\n

Но, бидејќи методот .times исто така ќе го врати бројот на shrews може да\nја избришеме целата последна линија. Всушност, оригиналниот метод веќе го направи тоа што го баравме цело време!

\n","load_code":""}, "37":{"lang":"MK","title":"Здраво, кој е таму? Тука е Резимето #5!","chapter":"Y","answer":"","ok":"","error":"","text":"

Многу добро сторено, многу добро сторено, многу добро сторено, многу добро сторено!

\n\n

Навистина, навистина, навистина, навистина, навистинаааааа!

\n\n

Ова се последните минути од твојот живот во ретроспектива:

\n\n

Методи

\n\n

Методите се дефинираат со резервираниот збор def и имаат име. Методите ја прават твојата\nпрограма пократка и полесна за читање.

\n\n

Параметри

\n\n

Методите може да имаат параметри.

\n\n

Return вредности

\n\n

Методите (скоро) секогаш враќаат вредност.

\n\n

Сега

\n\n

Да се биде или не не е повеќе прашање за тебе. Дали си подготвен за прикажување \nповеќе од Шекспир?

\n","load_code":""}, -"38":{"lang":"MK","title":"Светот е нашата школка (Извадок од Шекспирово дело)","chapter":"N","answer":"^\\{\\\"William","ok":"Добро. Малку потешко за читање.","error":"","text":"

Сѐ до сега извршувавме програми кои користат работи што сами ги пишувавме.\nШто е добро, иако Odelaying беше епска, ова е интернет ера и е веќе време да го приклучиме \nостатокот од светот во нашите напори за програмирање.

\n\n

Многу, многу, многу веб страни се достапни за да ги прашаш за одредени информации. На пример,\nследниот линк ќе ти ги даде сите моментални новости на Google поврзани со Ruby.

\n\n

Твојот веб прелистувач најверојатно ќе ти ги прикаже во средена верзија за тебе. \nАко погледнеш во изворот (type: control-U)\nќе видиш долг стринг формиран од чудни карактери. Примерот на Google е во rss формат.

\n\n

Формати

\n\n

Има многу други формати, со чудни имиња, кои се достапни и се користат на веб, како:\nhtml, xml и json. Да, дури и оваа веб страна користи некои од нив.

\n\n

Подготвив метод за тебе кој, ќе земе и ќе достави низа со комплетната работа на \nВилијам Шекспир од интернет.\n(Не грижи се, најверојатно доаѓа од истиот сервер на кој што оваа веб страна работи, \nпа така не досадуваме на никого.)

\n\n

Преземи ги податоците со следната команда:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"MK","title":"Светот е нашата школка (Извадок од Шекспирово дело)","chapter":"N","answer":"^\\{\\\"William","ok":"Добро. Малку потешко за читање.","error":"","text":"

Сѐ до сега извршувавме програми кои користат работи што сами ги пишувавме.\nШто е добро, иако Odelaying беше епска, ова е интернет ера и е веќе време да го приклучиме \nостатокот од светот во нашите напори за програмирање.

\n\n

Многу, многу, многу веб страни се достапни за да ги прашаш за одредени информации. На пример,\nследниот линк ќе ти ги даде сите моментални новости на Google поврзани со Ruby.

\n\n

Твојот веб прелистувач најверојатно ќе ти ги прикаже во средена верзија за тебе. \nАко погледнеш во изворот (type: control-U)\nќе видиш долг стринг формиран од чудни карактери. Примерот на Google е во rss формат.

\n\n

Формати

\n\n

Има многу други формати, со чудни имиња, кои се достапни и се користат на веб, како:\nhtml, xml и json. Да, дури и оваа веб страна користи некои од нив.

\n\n

Подготвив метод за тебе кој, ќе земе и ќе достави низа со комплетната работа на \nВилијам Шекспир од интернет.\n(Не грижи се, најверојатно доаѓа од истиот сервер на кој што оваа веб страна работи, \nпа така не досадуваме на никого.)

\n\n

Преземи ги податоците со следната команда:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"MK","title":"Двајцата благородни земјаци","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"Ова е многу подобро","error":"","text":"

Супер, сега имаме низа со претстави од интернет. Оваа низа е во json формат.\nЗа наша среќа, Ruby има метод со кој ќе направиме конверзија на json податоците во hash.\nМетодот get_shakey веќе го направи тоа за нас.

\n\n

Бидејќи структурата на json податоците е ставена во hash, сеуште е потешка за читање.\nАјде да напишеме метод со кој ќе ги прикажеме претставите во читлив формат.

\n\n

Доколку направиш инспекција на низата од претстави, ќе забележиш дека има вградена структура.\n(Ова всушност е многу честа појава кај податоци кои ги преземаш од интернет.)\nИзгледа како во примерот:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Со цел да ги прикажеме претставите, прво треба да пристапиме до најгорниот hash елемент “William Shakespeare” преку неговото име.\nПотоа треба да поминеме низ секој елемент под него.

\n\n

Ruby има метод за повторување. Се вика each. Овој метод го сретнавме кога креиравме\nсопствен рејтинг систем за книги.

\n\n

Сѐ што методот each враќа се испраќа во блок:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"MK","title":"Сите заедно сега","chapter":"N","answer":"^4$","ok":"Да, Шекспир напишал 4 претстави во 1591","error":"Одговорот за годината 1591 треба да биде 4","text":"

Сега претпостави дека сакаме да ги знаеме имињата и бројот на претстави напишани\nод Шекспир само за одредена година.

\n\n

Ruby ни дозволува да селектираме вредности од hash. Методот select користи блок преку кој\nни дозволува да дефинираме што сакаме да селектираме и ни го враќа она што го пронашол.

\n\n

Потоа, може да го искористиме резултатот добиен од select методот во each методот (како претходно) со тоа што ќе го додадеме после select блокот. Ова е друг пример за поврзување на методи,\nкој го сретнавме претходно кога ја прикажувавме поемата во обратен редослед.

\n\n

Го подготвив методот count_plays за тебе. Пробај да видиш дали можеш да најдеш колку претстави\nсе напишани од Шекспир во годината 1591. Пробај го следново:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

Дали забележа дека го поврзав count методот на крајот на секој each метод. Ова ни ја враќа\nвредноста од count_plays_ методот.

\n\n

Тука, има и друга можност за поврзување на методи. Ја гледаш таа осамена линија код s = get_shakey.\nМожеш да додадеш [“William Shakespeare”].select { |k, v| на крајот од get_shakey\n(не е потребно за овој случај).

\n","load_code":"prev"}, "41":{"lang":"MK","title":"Сѐ е добро штом добро ќе заврши","chapter":"N","answer":"All's Well That Ends Well","ok":"True","error":"Стави 1605 како втор параметар","text":"

Добро, имаме податоци од интернет, селектиравме што сакавме и ги прикажавме резултатите.\nШто остана за подобрување? Може да ги прикажеме резултатите во подобра верзија. Како на пример\nда ја додадеме годината и да ги израмнеме насловите и годините.

\n\n

Тоа значи прикажување на неколку вредности во една линија. Ruby има елегантен начин\nза тоа. Тоа е исто како прикажување на стринг: puts “Hi, my name is Jimmy”.\nНо, наместо да ја користиме буквалната вредност Jimmy, ние ќе ја користиме вредноста на променливата.

\n\n

Прво, замени го Jimmy со #{}. Ако Ruby забележи дека имаш hash симбол проследен со { } наводници\n{ бара променлива која се наоѓа меѓу отворената заграда и затворената заграда }.\nТака, може да се искористи следното: “Hi, my name is #{name}”.

\n\n

Ајде малку да го промениме кодот

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n    year_from <= v["finished"] &&\n    year_to   >= v["finished"]\n  }.each { |k, v|\n    puts "#{v["title"].ljust(30)} #{v["finished"]}"\n  }\nend\nprint_plays(1600, 1605)\n
\n\n

Додадов .ljust(30) на насловот. На овој начин, насловот е порамент од лева страна (анг. left justified) со минимум 30 карактери\nза годината да се порамни убаво.

\n\n

Значи, пробај да видиш дали ќе можеш да го промениш аутпутот на програмата за да ја прикаже претставата како во примерот:\n1600 -> As You Like It

\n\n

Сѐ е добро штом добро ќе заврши? Не, сеуште не сме готови, но крајтот се гледа!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"МК","title":"Работите кои ги сочинуваат апликациите","chapter":"N","answer":"","ok":"","error":"","text":"

Ти отвори нова BlurbTM класа. Од што се состои твојот елемент?\nСодржина (анг. content), се разбира. Исто така, треба да го зачуваш \nвремето (анг. time) кога BlurbTM е креиран. И, расположение (анг. mood).

\n\n

Во ред, веќе ја имаш првата линија код од класата, еве го остатокот:

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

Името на класата секогаш започнува го голема буква.

\n\n

(Сеуште немаме резултат)

\n","load_code":""}, "48":{"lang":"МК","title":"Accessors може да се споредат со екстремитетите на човечко тело","chapter":"N","answer":"Blurb:","ok":"Мојот прв Blurb","error":"","text":"

Супер дефинирана класа, читателу. Ти сега имаш нова BlurbTM класа.

\n\n

При дефинирање на класата, ти користеше метод наречен attr_accessor.\nИма многу attribute методи како на пример методот која додава мали преференци на класата.\nОвие атрибути (анг. attributes) се само променливи прикачени за класа.

\n\n

Размислувај на овој начин. Класата е како човек. А, атрибутите се различните делови\nод кои е направено човечкото тело, како на пример рака чија една од функционалностите е \nракување со друг човек.

\n\n

Сега

\n\n

За да креираш BlurbTM и да ставиш содржина погледни го примерот:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"МК","title":"Објект, тоа мало убаво пакување","chapter":"N","answer":"Blurb:","ok":"Blurb е ажуриран","error":"","text":"

Те охрабрувам да пробаш да ставиш време и расположение на BlurbTM:

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"МК","title":"Ајде малку да забрзаме","chapter":"N","answer":"^\\d{4}","ok":"Забележано","error":"","text":"

Супер, твојата апликација е прекрасна. Ајде малку да ти ги олесниме работите.\nТи сигурно не сакаш да го ставаш времето на овој начин секогаш кога креираш или ажурираш BlurbTM.

\n\n

Ти само сакаш да внесеш содржина и да го поставиш расположението, нели?

\n\n

Ајде да додадеме initialize метод на нашата класа. Овој метод се повикува секогаш кога е креиран нов BlurbTM.\nВо исто време може да ставиме лимит за должината на содржината на BlurbTM да биде 40 карактери.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(Параметарот content=“” е тука за да нѐ потсетува дека содржината е од тип Стринг,\nиако параметер со содржина не е пуштен во initialize методот.)

\n","load_code":""}, +"50":{"lang":"МК","title":"Ајде малку да забрзаме","chapter":"N","answer":"^\\d{4}","ok":"Забележано","error":"","text":"

Супер, твојата апликација е прекрасна. Ајде малку да ти ги олесниме работите.\nТи сигурно не сакаш да го ставаш времето на овој начин секогаш кога креираш или ажурираш BlurbTM.

\n\n

Ти само сакаш да внесеш содржина и да го поставиш расположението, нели?

\n\n

Ајде да додадеме initialize метод на нашата класа. Овој метод се повикува секогаш кога е креиран нов BlurbTM.\nВо исто време може да ставиме лимит за должината на содржината на BlurbTM да биде 40 карактери.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(Параметарот content=“” е тука за да нѐ потсетува дека содржината е од тип Стринг,\nиако параметер со содржина не е пуштен во initialize методот.)

\n","load_code":""}, "51":{"lang":"МК","title":"Ти ја научи апликацијата да ги одбива непотребните работи","chapter":"N","answer":"Blurb:","ok":"Blurb е додаден","error":"","text":"

Дали забележа дека внатре во класата ние користевме at-симболи (@time).

\n\n

Надвор од класата, ние искористивме accessors:

\n\n
\n

blurb.time = Time.now

\n
\n\n

но, внатре ги користиме променливите од објектот:

\n\n
\n

@time = Time.now

\n
\n\n

Тие се едно исто, но прикажани на две различни места во твојата програма.

\n\n

Креирај нов BlurbTM

\n\n

Кога нов BlurbTM е креиран, initialize методот се користи за да провери дали има нови параметри.

\n\n

Во овој случај, нам ни требаат два параметри:

\n\n
Blurb2 = Blurb.new :confused, "I can not believe Mt. Hood was stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"МК","title":"Жирафа не го украде Резимето #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Браво, успеа да стигнеш до тука. Твојата апликација ќе ја направиме да биде реална, но прво да направиме резиме, може?

\n\n

Класи

\n\n

Сѐ во Ruby е некаков вид на објект. Класите ги објаснуваат објектите, односно како тие функционираат.\nНа пример, ти направи неколку BlurbTM објекти и тие се објаснети во Blurb класата.\nСо други зборови: ние ги викаме Blurb објекти.\nМожеш да ги користиш класите за (речиси) да моделираш објекти од реалниот свет.

\n\n

Accessors

\n\n

Accessors се променливи прикачени на објект кои можат да се користат надвор од објектот.\n(blurb2.time = Time.now)

\n\n

Објект променливи

\n\n

Објект променливи се истите променливи што ти ги користиш како accessors, но внатре во самиот објект.\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"МК","title":"Твојата сопствена територија","chapter":"N","answer":"Blurbalizer:","ok":"myapp е креирана","error":"","text":"

Тука може да ги привршуваме работите, читателу. Тука е последното поглавје од епската приказна на TryRuby!\nСега кога имаш ориентација како сѐ работи, како ќе ги искористиш за твојата куќа и за твојот замрзнувач? \nТи си прекрасна личност, дури и една од моите омилени, но сепак ти треба насочување.

\n\n

Ајде да ја завршиме твојата апликација

\n\n

Ти имаш елементи, но немаш вистинска програма.\nСеуште треба наслов, некое место за да ги зачуваме сите BlurbsTM и времеплов (анг. timeline) со цел да функционира.

\n\n

Погоди што? Ние ќе користиме уште една класа. Во следниот пример е прикажан целиот код од новата класа во една целина.\nДозволи си онолку време колку што ти треба за да го проучиш.\nЈас не сум во брзање, ќе те причекам во следната лекција.

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # Нова празна низа \n                 # за зачувување Blurbs\n  end\n\n  def add_a_blurb(mood, content)\n    # Овој знак << значи додај го елементот на крајот од низата\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/source/try_ruby_nl.json b/source/try_ruby_nl.json index c86f636e..a675b580 100644 --- a/source/try_ruby_nl.json +++ b/source/try_ruby_nl.json @@ -17,15 +17,15 @@ "17":{"lang":"NL","title":"Elementair","chapter":"N","answer":"^(12|35|47)$","ok":"Ok","error":"Bijna","text":"

We hebben ons lijstje met bingo getallen in variabele kaart staan. Hoe krijgen we\nde getallen er weer één voor één uit?

\n\n

We hebben max al gebruikt om het hoogste getal te bepalen. Je kunt ook first\nof last gebruiken voor het eerste en laatste element van de lijst.\nMaar hoe haal je er één specifiek element uit?

\n\n

[ ]

\n\n

Ruby gebruikt hiervoor de vierkant teksthaken.\nDeze worden trouwens heel vaak gebruikt in Ruby.

\n\n

Ok, we halen de bingo getallen één voor één op:

\n\n
puts kaart[0]\nputs kaart[1]\nputs kaart[2]\n
\n\n

Maar waarom [0], [1], [2] ? En niet [1], [2] and [3] ?

\n\n

Heeft dat met dat Japanse Zen gedoe te maken?
\nNee hoor, computer programmeurs beginnen nou eenmaal graag met tellen vanaf\nnul. En niet alleen Ruby programmeurs maar alle programmeurs. Het heeft\nzelfs een naam: zero based indexing.

\n\n
\n

Tip: mocht je het vergeten zijn, je kunt de Copy knop gebruiken om de\nvoorbeeldcode over te nemen in de editor.

\n
\n","load_code":"kaart = [12, 47, 35]"}, "18":{"lang":"NL","title":"We zijn bij samenvatting 2","chapter":"Y","answer":"\\w+","ok":"Rijmt het ?","error":"","text":"

Kijk eens wat we in het tweede deel hebben geleerd:

\n\n

Foutmeldingen

\n\n

Probeer je een nummer om te draaien of doe je iets anders verdachts, dan vertelt\nRuby dat met een foutmelding.

\n\n

Array’s

\n\n

Een array is een lijst om dingen in een bepaalde volgorde in op te slaan.

\n\n

Variabelen

\n\n

In een variabele kan je dingen bewaren. En je kunt een variable een naam geven.\nMet het = teken geef je een waarde aan een variabele. Bijvoorbeeld:
\nkaart = [14, 37, 18].

\n\n

2/8

\n\n

Deze cursus bevat acht delen. Je bent dus al op een kwart!\nEigenlijk best wel simpel allemaal. Er komen nog veel leuke dingen langs.

\n\n

Maar,

\n\n

nu eerst even wat anders. Hou je een beetje van poëzie? Ik heb een versje\ngemaakt en in een variabele gestopt. Kijk maar:

\n\n
puts vers\n
\n","load_code":"vers = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, "19":{"lang":"NL","title":"Helaas, je houd niet van toast","chapter":"N","answer":"(toast){0}","ok":"Heerlijk","error":"","text":"

Ik snap het helemaal als je niet van versjes over toast houdt. Ik zou zeggen pas het maar\naan. Leef je uit. Verander de toast maar in een boterham of zo. Begin zo:

\n\n
vers.gsub("toast", "stroopwafel")\n
\n\n

De gsub methode staat voor: global substitute. Daarmee vervang je iedere\n“toast” door “stroopwafel”.

\n\n
\n

Voetnoot van de vertaler: ik vond de Engelse versie van het gedicht te leuk en te\nlastig om te vertalen. Heb het dus maar zo gelaten.
\nJe zult al wel gemerkt hebben dat veel dingen helemaal niet te vertalen zijn.\nZoals de taal Ruby zelf.
\nIn de praktijk is Engels de voertaal voor programmeurs. Wen er maar vast aan.

\n
\n","load_code":"prev"}, -"20":{"lang":"NL","title":"Ready, Aim","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"Lijkt wel Latijn","error":"","text":"

Even een vraagje: wat gebeurt er als we het hele gedicht omdraaien?

\n\n
vers.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"NL","title":"Ready, Aim","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"Lijkt wel Latijn","error":"","text":"

Even een vraagje: wat gebeurt er als we het hele gedicht omdraaien?

\n\n
vers.reverse\n
\n","load_code":"prev"}, "21":{"lang":"NL","title":"Te veel van het goede","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"Ja, we zijn er bijna","error":"","text":"

We hebben het hele vers omgedraaid, letter voor letter.\nIk wilde eigenlijk alleen maar de volgorde van de regels omdraaien.

\n\n

Dus de regels achterstevoren. Niet de letters, dat zou achterlijk zijn.

\n\n

Zoiets:

\n\n
vers.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"NL","title":"De schakels van de ketting","chapter":"N","answer":"^More still did (.+)","ok":"Goed gedaan hoor!
De join methode heeft dat array weer aan elkaar geplakt.","error":"","text":"

Wat gebeurde daar ? Je voerde vers.lines.reverse uit en toen?

\n\n

Twee dingen. Eerst zette je het versje om in losse regels met de lines\nmethode. Lines (regels in het Nederlands) zet een string om naar een array.\nIedere regel wordt één element in het array.

\n\n

Vervolgens heb je het array omgedraaid. Regel voor regel.

\n\n

We voegen nog één methode toe aan het einde:

\n\n
puts vers.lines.reverse.join\n
\n\n
\n

Als we meerdere methodes op deze manier aan elkaar koppelen, als een soort\nketting van methoden, noemen we dit in het Engels: method chaining.

\n
\n","load_code":"prev"}, +"22":{"lang":"NL","title":"De schakels van de ketting","chapter":"N","answer":"My toast has flown from my hand","ok":"Goed gedaan hoor!
De join methode heeft dat array weer aan elkaar geplakt.","error":"","text":"

Wat gebeurde daar ? Je voerde vers.lines.reverse uit en toen?

\n\n

Twee dingen. Eerst zette je het versje om in losse regels met de lines\nmethode. Lines (regels in het Nederlands) zet een string om naar een array.\nIedere regel wordt één element in het array.

\n\n

Vervolgens heb je het array omgedraaid. Regel voor regel.

\n\n

We voegen nog één methode toe aan het einde:

\n\n
puts vers.lines.reverse.join\n
\n\n
\n

Als we meerdere methodes op deze manier aan elkaar koppelen, als een soort\nketting van methoden, noemen we dit in het Engels: method chaining.

\n
\n","load_code":"prev"}, "23":{"lang":"NL","title":"O nee, samenvatting 3","chapter":"Y","answer":"\\{\\}","ok":"Je hebt een haspel gemaakt !","error":"","text":"

Uitroeptekens

\n\n

Methodes kunnen gevolgd worden door een uitroepteken (soms ook een vraagteken).\nDeze zijn er alleen maar om goed duidelijk te maken wat de functie is van de\nmethode. Dat is alles.

\n\n

String manipulatie

\n\n

Wijzigen van strings.

\n\n

Chaining

\n\n

Door methoden aaneen te rijgen, als de schakels van een ketting, kan je heel veel\ndoen met heel weinig code. Een versje splitsen, omdraaien en weer in elkaar zetten:
\nvers.lines.reverse.join

\n\n

Misschien vind je het leuk om nog wat meer met het gedicht to spelen. Bijvoorbeeld met\nvers.downcase of vers.swapcase. De complete lijst met string methoden is\nhier\nte vinden.

\n\n

Klaar ?

\n\n

Als je door wilt gaan typ dan:

\n\n
boeken = {}\n
\n","load_code":"prev"}, "24":{"lang":"NL","title":"Een boekenlijst","chapter":"N","answer":"^(uitstekend|best_goed|matig|best_wel_slecht|vreselijk)$","ok":"Dank je voor je boekverslag","error":"Gebruik: uitstekend, best_goed, matig, best_wel_slecht of vreselijk.
Vergeet de dubbele punt niet","text":"

Je hebt net een lege haspel gemaakt. Een wat ?

\n\n

In het Engels heet dit een hash. En ik stel voor dat we dat woord voortaan gebruiken.\nHash betekent zoiets als verhaspelen, het bij elkaar en door elkaar gooien van de letters\nvan een woord zodat het korter wordt. Het heeft te maken met de manier waarop Ruby\neen hash opslaat in het geheugen van de computer. Is verder niet belangrijk om te weten.

\n\n
\n

Wel belangrijk om te weten is dat een hash hetzelfde is als een array, alleen\nheeft ieder element van de hash een naam. Een array element heeft alleen een nummer.

\n
\n\n

We gaan onze hash gebruiken om er wat boekverslagen in op te slaan. Dit zijn de waarderingen:

\n\n
    \n
  • :uitstekend → een meesterwerk
  • \n
  • :best_goed → amusant
  • \n
  • :matig → goed en slecht tegelijk
  • \n
  • :best_wel_slecht → vooral slecht
  • \n
  • :vreselijk → hopeloos geval
  • \n
\n\n

Om een boekverslag toe te voegen zetten we de titel van het boek tusen [ ] haakjes en\nomdat de titel een string is ook tussen aanhalingstekens. Bijvoorbeeld:

\n\n
boeken["De regenboog"] = :uitstekend\n
\n\n
\n

Het is misschien wel handig om te weten dat alle TryRuby lessen los van elkaar\nstaan. Dus als je hier tig boekverslagen intypt kan je die alleen in deze les gebruiken.\nJe kan ze natuurlijk wel kopieëren en plakken in de volgende les.
\nIk heb iedere les voldoende dingen meegegeven waar je mee kunt spelen.

\n
\n","load_code":"boeken = {}"}, "25":{"lang":"NL","title":"Meer reviews","chapter":"N","answer":"[3-9]","ok":"De length methode werkt zowel voor een string, array als hash","error":"","text":"

Ok, ga maar door met toevoegen van boekverslagen. Als je de hele lijst wilt zien\nkan je puts boeken gebruiken.

\n\n

De beoordelingen zijn: :uitstekend, :best_goed, :matig, :best_wel_slecht, :vreselijk.

\n\n
\n

De hier getoonde beoordelingen zijn geen strings. Als je een dubbele punt voor een woord\nzet krijg je een symbool.

\n
\n\n

Symbolen kosten de computer minder geheugenruimte. Maar belangrijker:\nals je een symbool in een programma ziet staan geeft dat aan dat dat symbool een bepaalde\nbetekenis heeft en niet zomaar een willekeurig gekozen woord is.

\n\n

Voeg nog 2 boekverslagen toe. Gebruik boeken.length om te zien hoeveel verslagen\ner al in de hash zitten:

\n\n
boeken["Het puffertje"] = :vreselijk\nboeken["Kleurenblind"] = :matig\n\nputs boeken\n\nputs boeken.length\n
\n","load_code":"boeken = {\"De regenboog\" => :uitstekend}"}, "26":{"lang":"NL","title":"Eh, wat vond ik ook al weer van De regenboog?","chapter":"N","answer":"^(uitstekend|quite_good|mediocre|quite_not_good|abysmal)$","ok":"O ja, ik vond het een meesterwerk","error":"","text":"

Weet je nog hoe we een waarde uit een array haalden:
\nputs ticket[1].

\n\n

Bij een hash werkt dit hetzelfde, alleen gebruiken we geen nummer om een element op te zoeken\nmaar een naam.

\n\n

Dus als je een oud boekverslag op wilt zoeken zet je nu de naam van het boek tussen de [ ]\nhaken. En het = teken laten we weg:

\n\n
boeken["De regenboog"]\n
\n","load_code":"boeken = {\"De regenboog\" => :uitstekend, \"Het puffertje\" => :vreselijk, \"Kleurenblind\" => :matig}"}, "27":{"lang":"NL","title":"De hash als paar","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Je hebt de sleutels gevonden","error":"","text":"

In tegenstelling tot een array kent een hash geen volgorde van zijn elementen. Daar\nis een hash ook niet voor gemaakt.

\n\n

Een hash bevat alleen maar paren. Ieder paar bestaat uit een sleutel en een\nwaarde (key en value in het Engels).

\n\n

In jouw boekverslagen is de titel van het boek de sleutel en de beoordeling is de waarde.

\n\n

Als je alle boektitels wilt zien kan je alle hash sleutels opvragen:

\n\n
boeken.keys\n
\n\n

Probeer dit ook eens met .values in plaats van .keys.

\n","load_code":"prev"}, -"28":{"lang":"NL","title":"Hoe streng ben jij?","chapter":"N","answer":"\"matig\"","ok":"Wow! Je hebt een scorelijst gemaakt.","error":"","text":"

Misschien geef jij wel gemene boek beoordelingen ? We gaan de score eens bijhouden.\nDat doen we in een nieuwe hash scores:

\n\n

Ik heb wat code geschreven om de beoordelingen te tellen. Geen paniek als je de code\nniet meteen begrijpt. In de volgende lessen wordt het allemaal uitgelegd.

\n\n

Typ:

\n\n
scores = Hash.new {0}\n\nboeken.values.each { |beoordeling|\n  scores[beoordeling] += 1\n}\n\nputs scores\n
\n\n

Dat verticale streepje | zit op de meeste toetsenborden boven de enter toets.

\n\n

Die regel met += 1 betekent: verhoog de waarde met 1.

\n","load_code":"boeken = {\"De regenboog\" => :uitstekend, \"Het puffertje\" => :vreselijk, \"Kleurenblind\" => :matig, \"Bloemetjes en bijtjes\" => :matig}"}, +"28":{"lang":"NL","title":"Hoe streng ben jij?","chapter":"N","answer":":matig","ok":"Wow! Je hebt een scorelijst gemaakt.","error":"","text":"

Misschien geef jij wel gemene boek beoordelingen ? We gaan de score eens bijhouden.\nDat doen we in een nieuwe hash scores:

\n\n

Ik heb wat code geschreven om de beoordelingen te tellen. Geen paniek als je de code\nniet meteen begrijpt. In de volgende lessen wordt het allemaal uitgelegd.

\n\n

Typ:

\n\n
scores = Hash.new {0}\n\nboeken.values.each { |beoordeling|\n  scores[beoordeling] += 1\n}\n\nputs scores\n
\n\n

Dat verticale streepje | zit op de meeste toetsenborden boven de enter toets.

\n\n

Die regel met += 1 betekent: verhoog de waarde met 1.

\n","load_code":"boeken = {\"De regenboog\" => :uitstekend, \"Het puffertje\" => :vreselijk, \"Kleurenblind\" => :matig, \"Bloemetjes en bijtjes\" => :matig}"}, "29":{"lang":"NL","title":"Een blokje om","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

We hebben net een mooie en handige eigenschap van Ruby gebruikt, namelijk een blok.\nDaar gaan we in deze en de volgende les eens beter naar kijken.

\n\n

Heel simpel gezegd is een blok gewoon een stukje Ruby code dat tussen accolades { } staat.

\n\n

Hier heb ik nog een blok voor je:

\n\n
5.times { print "Odelay! " }\n
\n\n

Een blok zit altijd vast aan een methode. In dit voorbeeld de times methode.
\nTimes (keer) voert een blok meerdere keren uit. In dit geval 5 keer.

\n","load_code":""}, "30":{"lang":"NL","title":"Ben je bij de tijd?","chapter":"N","answer":"^[0-9]$","ok":"Goed getimed!","error":"Voer het blok 0 tot 9 keer uit.","text":"

In het eerste voorbeeld van een blok (bij het maken van de scorelijst) zagen we al dat\nwe een waarde kunnen doorgeven aan het blok.\nWelke waarden worden doorgegeven wordt bepaald door de methode die het blok uitvoert.

\n\n

De waarden die worden ontvangen door het blok, worden in de variabele gezet die\naan het begin van het blok tussen 2 verticale streepjes | staat.

\n\n

We kunnen dit uitproberen met het volgende blok:

\n\n
5.times { |tijd|\n  puts tijd\n}\n
\n\n

Methode .times geeft een waarde door aan variabele |tijd|.
\nDe tijd variabele is alleen maar binnen het blok bekend !

\n\n
\n

Zie je dat je code over meerdere regels uit kunt splitsen? Dit maakt code\nmakkelijker te lezen.

\n
\n","load_code":""}, "31":{"lang":"NL","title":"Samenvatting 4 is hier","chapter":"Y","answer":"","ok":"","error":"","text":"

Deel 3 duurde wat langer om door te nemen. Je hebt dit allemaal geleerd:

\n\n

Hash

\n\n

Een soort woordenboek met sleutels en waarden, die je maakt met: {}

\n\n

Symbolen

\n\n

Korte, duidelijke, efficiente woorden, die beginnen met een dubbele punt: :uitstekend

\n\n

Blokken

\n\n

Stukjes code die je aan allerlei Ruby methoden kunt hangen. Hiermee maakte je een\nscorelijst:
\nboeken.values.each { |beoordeling|
\n  scores[beoordeling] += 1
\n}

\n\n

En nu

\n\n

In de volgende lessen gaan we ons verder verdiepen in methoden.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"NL","title":"De zoete vruchten van je eigen creatie","chapter":"N","answer":"^Een heks is getemd","ok":"Dat zal ze leren","error":"","text":"

En zo worden nieuwe methodes geboren.

\n\n

Ik wil ‘em meteen gebruiken:

\n\n
tem 5\n
\n","load_code":"def tem( aantal_heksen );aantal_heksen.times{puts \"Een heks is getemd\"};end;"}, "36":{"lang":"NL","title":"Geven en nemen","chapter":"N","answer":"\\d+","ok":"Ja. Super.","error":"","text":"

De meeste methoden willen niet alleen één of meer parameters als invoer, maar geven ook\nweer iets terug. Ik heb onze methode een beetje aangepast zodat we een waarde terug krijgen.\nRuby gebruikt hiervoor het woordje return.

\n\n

Probeer maar:

\n\n
def tem( aantal_heksen )\n  aantal_heksen.times {\n    puts "Een heks is getemd"\n  }\n  return aantal_heksen\nend\n\nputs tem(3)\n
\n\n

Return

\n\n

En omdat je zo leergierig bent heb ik nog een extra tip voor je:\nje mag in Ruby het woordje return weglaten. Ruby geeft automatisch de laatste\nwaarde waar in de methode iets mee gedaan is terug.

\n\n

De laatste regel van de methode kunnen we veranderen in: aantal_heksen.\nProbeer maar.

\n\n

Maar. Methode .times geeft ook al aantal_heksen terug. Dus we kunnen die hele\nlaatste regel weglaten.
\nEigenlijk deed de oorspronkelijke versie van de methode al precies wat we wilden!

\n","load_code":""}, "37":{"lang":"NL","title":"Ben je er nog? Samenvatting 5 groet u","chapter":"Y","answer":"","ok":"","error":"","text":"

Goed gedaan! Echt. Serieus. Ik meen het.

\n\n

Dit heb je in de afgelopen minuten geleerd:

\n\n

Methoden

\n\n

Methoden kan je definiëren met def en een naam. Methodes zorgen ervoor dat je\nprogramma’s korter en beter leesbaar zijn.

\n\n

Parameters

\n\n

Methodes kunnen parameters hebben.

\n\n

Return waarde

\n\n

Methodes geven (bijna) altijd een waarde terug.

\n\n

En verder

\n\n

To be or not to (be) weten we nu het antwoord wel op.
\nNog maar 3 delen te gaan.
\nInteresse in meer Shakespeare?

\n","load_code":""}, -"38":{"lang":"NL","title":"We kunnen de hele wereld aan","chapter":"N","answer":"^\\{\\\"William","ok":"Goed. Wel lastig te lezen zo.","error":"","text":"

Tot op heden hebben we programma’s uitgevoerd die we zelf hebben ingetypt. En dat is\nharstikke leuk. Vooral dat Odelayen vond ik een hoogtepunt.\nMaar dit is wel het internet tijdperk. Het wordt dus tijd om de rest van de wereld\nbij ons programmeerwerk te betrekken!

\n\n

Er zijn heel veel websites beschikbaar die je om informatie kunt vragen. Deze link geeft\nje bijvoorbeeld al het\nactuele nieuws\nover Ruby.

\n\n

Jouw web browser toont dit waarschijnlijk in een goed leesbaar formaat. Maar kijk eens naar\nde broncode van die webpagina (met control-U). Dan zie een lange regel met vreemd opgemaakte\ntekst. In het Google news voorbeeld is dit het rss formaat.

\n\n

Formaten

\n\n

Er zijn heel veel verschillende formaten in gebruik op het grote internet. Met\nrare namen als: html, xml en json. Ook deze website gebruikt dit soort formaten.

\n\n

Ik ben zo vrij geweest een methode voor te bereiden waarmee je de volledige lijst\nmet toneelstukken van William Shakespeare van het internet haalt.\n(Stiekum komt deze lijst van de server waar deze website op draait, we vallen dus\nniemand lastig.)

\n\n

Haal de gegevens op met:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"NL","title":"We kunnen de hele wereld aan","chapter":"N","answer":"^\\{\\\"William","ok":"Goed. Wel lastig te lezen zo.","error":"","text":"

Tot op heden hebben we programma’s uitgevoerd die we zelf hebben ingetypt. En dat is\nharstikke leuk. Vooral dat Odelayen vond ik een hoogtepunt.\nMaar dit is wel het internet tijdperk. Het wordt dus tijd om de rest van de wereld\nbij ons programmeerwerk te betrekken!

\n\n

Er zijn heel veel websites beschikbaar die je om informatie kunt vragen. Deze link geeft\nje bijvoorbeeld al het\nactuele nieuws\nover Ruby.

\n\n

Jouw web browser toont dit waarschijnlijk in een goed leesbaar formaat. Maar kijk eens naar\nde broncode van die webpagina (met control-U). Dan zie een lange regel met vreemd opgemaakte\ntekst. In het Google news voorbeeld is dit het rss formaat.

\n\n

Formaten

\n\n

Er zijn heel veel verschillende formaten in gebruik op het grote internet. Met\nrare namen als: html, xml en json. Ook deze website gebruikt dit soort formaten.

\n\n

Ik ben zo vrij geweest een methode voor te bereiden waarmee je de volledige lijst\nmet toneelstukken van William Shakespeare van het internet haalt.\n(Stiekum komt deze lijst van de server waar deze website op draait, we vallen dus\nniemand lastig.)

\n\n

Haal de gegevens op met:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"NL","title":"The Two Noble Kinsmen","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"Dat is beter!","error":"","text":"

Okee, we hebben nu een lijst met toneelstukken. Deze lijst was in het json formaat.\nGelukkig kent Ruby een methode om json om te zetten naar een hash.\nDe get_shakey methode heeft dat al voor ons gedaan.

\n\n

Helaas is de structuur van het json bestand wel overgenomen in de hash. Nog steeds vrij\nlastig te lezen dus. Als we nou eens een methode maken die alles netjes uitprint.

\n\n

Kijk nog eens naar de lijst van de vorige les. Ziet er ongeveer zo uit:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Om alle toneelstukken te zien moeten we eerst het “William Shakespeare” hash element\nbenaderen. Daarna moeten we door alle elementen daaronder bladeren. Itereren\nheet dat.
\nRuby heeft hier een methode voor: each. We zijn ‘em al even tegengekomen bij\nhet maken van de boeken scores.

\n\n

We gaan alles wat methode each vindt doorgeven aan een blok:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"NL","title":"En nu in één keer","chapter":"N","answer":"^4$","ok":"Idd, Shakespeare schreef 4 toneelstukken in 1591. Druk baasje.","error":"Nee, in 1591 schreef hij er 4","text":"

Okee, maar stel dat we alleen geïnteresseerd zijn in de namen en het aantal toneelstukken\ndat door Shakespeare in één jaar is geschreven?

\n\n

Met select kunnen we waarden selecteren uit een hash. De select methode gebruikt een\nblok om aan te geven wat we precies willen selecteren.
\nWe kunnen de door select teruggegeven waarden gebruiken in de each methode. Dit hebben\nwe al eerder gezien en is weer een voorbeeld van method chaining.

\n\n
\n

Ik heb een tel_toneelstukken methode voor je gemaakt.\nProbeer jij eens uit te zoeken hoeveel toneelstukken Shakespeare in 1591 heeft geschreven:

\n
\n\n
def tel_toneelstukken(jaar)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == jaar\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs tel_toneelstukken(0)\n
\n\n

Viel het je op dat ik count aan de each methode heb vastgeplakt.\nDit zorgt voor de return waarde van de tel_toneelstukken methode.

\n\n

Er is nog een mogelijkheid voor method chaining. Zie je dat regeltje\ns = get_shakey eenzaam en alleen staan?\nJe zou [“William Shakespeare”].select { |k, v| achter get_shakey\nkunnen zetten (zonder punt in dit geval).

\n","load_code":"prev"}, "41":{"lang":"NL","title":"Eind Goed Al goed","chapter":"N","answer":"All's Well That Ends Well","ok":"Eind Goed Al goed","error":"Gebruik 1605 als tweede parameter","text":"

We hebben nu dus wat data van het internet gehaald, we hebben geselecteerd wat we wilden\nhebben en dit uitgeprint.\nWat nu nog ? We zouden de resultaten wat mooier kunnen printen. Met het jaar er bij en\nalles netjes uitgelijnd.

\n\n

Hiervoor moeten we twee waarden op één regel zetten. Ruby heeft daar een mooie truuk\nvoor. Het werkt net als het printen van een gewone string. Bijvoorbeeld:\nputs “Hallo, ik ben Jantje”.\nMaar in plaats van Jantje gebruiken we de waarde van een variabele.

\n\n

Eerst vervangen we Jantje door #{}. Ruby weet dan dat er een variable aankomt.\nDe string wordt nu:
\n“Hallo, ik ben #{naam}”.

\n\n

We passen onze code een beetje aan:

\n\n
def print_toneelstukken(jaar_van, jaar_tot)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      jaar_van <= v["finished"] &&\n      jaar_tot >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_toneelstukken(1600, 1605)\n
\n\n

Dat .ljust(30) heb ik toegevoegd om te zorgen dat de titel altijd minimaal 30\nletters lang is. Hierdoor is het jaartal mooi links uitgelijnd (left justified).

\n\n

Kan jij de code zo aanpassen dat de uitvoer er zo uitziet:
\n1600 -> As You Like It

\n\n

Eind Goed Al goed ?

\n\n

Hé we zijn er nog niet. Maar het eind is in zicht!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"NL","title":"Bouwstenen","chapter":"N","answer":"","ok":"","error":"","text":"

Je hebt een nieuwe BlurbTM klasse gemaakt.

\n\n

Wat gaan we daar allemaal in bijhouden? De BlurbTM tekst uiteraard.\nEn de datum en tijd van posten. En de stemming van de poster.

\n\n

We hebben de eerste regel van de klasse, dit is de rest:

\n\n
class Blurb\n  attr_accessor :tekst, :tijd, :stemming\nend\n
\n\n

De naam van een klasse begint altijd met een hoofdletter.

\n\n

(Nog steeds geen output)

\n","load_code":""}, "48":{"lang":"NL","title":"Accessors, De Toegangspoorten","chapter":"N","answer":"Blurb:","ok":"Mijn eerste Blurb","error":"","text":"

Hee, grote klasse die BlurbTM klasse!

\n\n

In de klasse definitie staat een methode: attr_accessor.\nEr zijn allerlei attribute methoden. Deze voegen wat eigenschappen toe aan je klasse.\nAttributen zijn gewoon variabelen die bij een klasse horen.

\n\n

De attr_accessor methode die wij gebruikten betekent: iedereen heeft toegang (access)\ntot de klasse variabelen: tekst, tijd, en stemming.

\n\n

Dus

\n\n

Om een BlurbTM maken:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.tekst = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :tekst,:tijd,:stemming;end"}, "49":{"lang":"NL","title":"Een Object, Een Pakketje","chapter":"N","answer":"Blurb:","ok":"Blurb updated","error":"","text":"

Maak de BlurbTM maar af. Voeg een tijd en stemming toe:

\n\n
blurb1.tijd = Time.now\nblurb1.stemming = :verdrietig\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.tekst=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"NL","title":"Dat kan sneller","chapter":"N","answer":"^\\d{4}","ok":"Genoteerd","error":"","text":"

Je app is nu al cool. Wat dacht je er van om jezelf wat werk uit handen te nemen.\nIedere keer dat er een BlurbTM gemaakt wordt moet je de tijd van posten\ninstellen. Best vervelend niet waar?

\n\n

We kunnen een initialize (initialiseer) methode aan onze klasse toevoegen.\nDeze methode wordt uitgevoerd zodra je een nieuwe BlurbTM maakt.

\n\n

Dan kunnen we ook meteen instellen dat de maximale BlurbTM tekst lengte\n40 tekens is:

\n\n
class Blurb\n  attr_accessor :tekst, :tijd, :stemming\n\n  def initialize(stemming, tekst="")\n    @tijd     = Time.now\n    @tekst    = tekst[0..39]\n    @stemming = stemming\n  end\nend\n\nBlurb.new.tijd\n
\n\n

(Parameter tekst=“” zorgt er voor dat we zeker weten dat tekst een string is.\nOok als Blurb.new wordt aangeroepen zonder parameters.)

\n","load_code":""}, +"50":{"lang":"NL","title":"Dat kan sneller","chapter":"N","answer":"^\\d{4}","ok":"Genoteerd","error":"","text":"

Je app is nu al cool. Wat dacht je er van om jezelf wat werk uit handen te nemen.\nIedere keer dat er een BlurbTM gemaakt wordt moet je de tijd van posten\ninstellen. Best vervelend niet waar?

\n\n

We kunnen een initialize (initialiseer) methode aan onze klasse toevoegen.\nDeze methode wordt uitgevoerd zodra je een nieuwe BlurbTM maakt.

\n\n

Dan kunnen we ook meteen instellen dat de maximale BlurbTM tekst lengte\n40 tekens is:

\n\n
class Blurb\n  attr_accessor :tekst, :tijd, :stemming\n\n  def initialize(stemming, tekst="")\n    @tijd     = Time.now\n    @tekst    = tekst[0..39]\n    @stemming = stemming\n  end\nend\n\nBlurb.new(:sick).tijd\n
\n\n

(Parameter tekst=“” zorgt er voor dat we zeker weten dat tekst een string is.\nOok als Blurb.new wordt aangeroepen zonder parameters.)

\n","load_code":""}, "51":{"lang":"NL","title":"Binnenste Buiten","chapter":"N","answer":"Blurb:","ok":"Blurb toegevoegd","error":"","text":"

Zag je dat er in de klasse voor de variabelen een @ teken stond (@tijd) ?

\n\n

Buiten de klasse, gebruiken we accessors:

\n\n
\n

blurb.tijd = Time.now,

\n
\n\n

maar binnenin de klasse gebruiken we object variabelen:

\n\n
\n

@tijd = Time.now.

\n
\n\n

Het gaat om precies dezelfde variabelen maar benaderd vanuit twee verschillende delen\nvan het programma.

\n\n

Maak nog maar eens een BlurbTM

\n\n

Als je nu een nieuwe BlurbTM maakt wordt de initialize methode aangeroepen\nom de opgegeven parameters te controleren.

\n\n

Uh, we hebben 2 parameters nodig:

\n\n
blurb2 = Blurb.new :verward, "I can not believe Mt. Hood was stolen!"\n
\n","load_code":"class Blurb;attr_accessor :tekst,:tijd,:stemming;def initialize(stemming, tekst=\"\");@tijd=Time.now;@tekst=tekst[0..39];@stemming=stemming;end;end;blurb1=Blurb.new(:verdrietig,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"NL","title":"Even pauze voor samenvatting 7","chapter":"Y","answer":"","ok":"","error":"","text":"

Ah daar ben je. En nog helemaal heel. We gaan zo verder met het af maken van jouw app,\nmaar eerst even reviewen, okee ?

\n\n

Klassen

\n\n

Alles in Ruby is een object. Objecten worden beschreven door een klasse definitie.\nJe hebt bijvoorbeeld wat BlurbsTM gemaakt en het gedrag van deze\nobjecten staat in de Blurb klasse.
\nIn andere woorden: je noemt ze Blurb objecten.
\nKlassen kan je gebruiken om een model te maken van echte tastbare objecten.

\n\n

Accessors

\n\n

Accessors zijn variabelen die bij een object horen en die je buiten de klasse\ndefinitie kunt gebruiken.
\n(blurb1.tijd = Time.now)

\n\n

Object variabelen

\n\n

Object variabelen zijn dezelfde variabelen als de accessors, maar dan binnenin\nde klasse.
\n(@tijd = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :verward, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"NL","title":"Op eigen benen","chapter":"N","answer":"Blurbalizer:","ok":"Mijn app is gemaakt","error":"","text":"

Okee, de laatste loodjes. Nu begint het laatste hoofdstuk van het aangrijpende,\nheroïsche verhaal over Ruby.
\nJe weet al heel goed hoe alles werkt en hoe je het moet toepassen.\nMaar nog een klein beetje begeleiding kan vast geen kwaad.

\n\n

Af maken die app

\n\n

Je hebt nu wel losse BlurbsTM, maar nog geen complete app.\nEen app heeft een titel nodig, een plek om BlurbsTM te bewaren\nen een tijdbalk kan ook geen kwaad.

\n\n

Één keer raden. We hebben nog een klasse nodig. Ik heb hieronder alle code gezet\ndie je nodig hebt.
\nNeem rustig de tijd om het door te nemen. Kijk of je alles snapt.
\nIk heb geen haast. Ik wacht op je bij de volgende les.

\n\n
class Blurbalizer\n  def initialize(titel)\n    @titel  = titel\n    @blurbs = [] # Een schoon nieuw array\n                 # om Blurbs in op te slaan\n  end\n\n  def voeg_blurb_toe(stemming, tekst)\n    # De << betekent: voeg iets toe aan het einde van een array\n    @blurbs << Blurb.new(stemming, tekst)\n  end\n\n  def toon_timeline\n    puts "Blurbalizer: #{@titel} heeft #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.tijd\n    }.reverse.each { |t|\n      puts "#{t.tekst.ljust(40)} #{t.tijd}"\n    }\n  end\nend\n\nmijnapp = Blurbalizer.new "De Laatste Blurbs"\n
\n","load_code":"class Blurb;attr_accessor :tekst,:tijd,:stemming;def initialize(stemming, tekst=\"\");@tijd=Time.now;@tekst=tekst[0..39];@stemming=stemming;end;end"}, diff --git a/source/try_ruby_pt-br.json b/source/try_ruby_pt-br.json index 49254778..7b36351e 100644 --- a/source/try_ruby_pt-br.json +++ b/source/try_ruby_pt-br.json @@ -17,15 +17,15 @@ "17":{"lang":"PT-BR","title":"Elemento","chapter":"N","answer":"^(12|35|47)$","ok":"Ok","error":"Quase","text":"

Então, nós guardamos os nossos números da loteria dentro de uma variável bilhete. Como fazemos para\ncolocá-los pra fora de novo?

\n\n

Nós já vimos que nós podemos obter o maior número com o método max. De forma similar, você pode obter\no primeiro, first, ou o último, last, elemento da lista.\nMas e se você quiser um elemento específico?

\n\n

[ ]

\n\n

Ruby usa colchetes [ ] para obter um elemento alvo.\nOs colchetes são muito comuns em Ruby.\nEles são como miras usadas para alinhar ao alvo. Exatamente.\nEsses colchetes significam: “Eu estou olhando pelo ____”. Pronto, mire.

\n\n

Vamos pegar todos os nossos números da loteria:

\n\n
puts bilhete[0]\nputs bilhete[1]\nputs bilhete[2]\n
\n\n

Por que nós usamos [0], [1], [2] ?

\n\n

E não [1], [2] e [3] ? Isso é algum tipo de coisa zen japonesa ?\nNão, nós, pessoas-computador, apenas gostamos de contar começando do zero. Isso não é algo apenas do Ruby,\neste índice com base zero é usado na maioria das linguagens de programação.

\n\n
\n

Um pequeno lembrete: você pode usar o botão Copy para copiar o exemplo para o editor.

\n
\n","load_code":"bilhete = [12, 47, 35]"}, "18":{"lang":"PT-BR","title":"Sumário #2 Está Sobre Nós","chapter":"Y","answer":"\\w+","ok":"Isto rima ?","error":"","text":"

Agora, vejamos como nosso segundo minuto foi:

\n\n

Erros

\n\n

Se você tentar inverter um número, o Ruby irá lhe dizer um erro.

\n\n

Arrays

\n\n

Arrays são listas para guardar coisas em alguma ordem.\nNós também aprendemos como criar arrays e recuperar itens de arrays.

\n\n

Variáveis

\n\n

Variáveis salvam a coisa e dão um nome pra ela. Você usou o símbolo de igual para isso. Por exemplo:\nbilhete = [14, 37, 18].

\n\n

2/8

\n\n

Ao todo, há oito seções. Você está a dois oitavos do caminho para fora daqui! Isto é algo simples,\nvocê não acha? Coisas boas a frente.

\n\n

Vamos mudar as direções por um momento. Eu coloquei um pedaço de um poema em uma certa variável.\nDê uma olhada. Digite:

\n\n
puts poema\n
\n","load_code":"poema = \"Minha torrada voou da minha mão\\nE minha torrada se foi para a lua.\\nMas quando eu vejo isso na televisão,\\nColocando nossa bandeira no cometa Halley,\\nMais ainda eu quero come-la.\\n\""}, "19":{"lang":"PT-BR","title":"Infelizmente, Você Odeia Poemas de Torradas","chapter":"N","answer":"(torrada){0}","ok":"Excelente","error":"Continua cheirando a torrada para mim","text":"

Olha, tudo bem. Você não tem que gostar disso. Hackeie isso, seja meu convidado. Ao invés de torrada,\nvá para melão ou algo do tipo. Tente isso para ver o novo poema:

\n\n
poema.gsub("torrada", "manga")\n
\n\n

O método gsub é abreviação para substituição global. Ele substitui todas as ocorrências de “torrada” para\n“manga”

\n","load_code":"prev"}, -"20":{"lang":"PT-BR","title":"Pronto, Mire","chapter":"N","answer":"^\\n.al-emoc (.+)","ok":"Ok, claro. Então todo o poema foi invertido.","error":"","text":"

Eis a questão: o que acontece quando nós invertemos todo o poema?

\n\n
poema.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"PT-BR","title":"Pronto, Mire","chapter":"N","answer":"oãm ahnim ad uoov adarrot ahniM","ok":"Ok, claro. Então todo o poema foi invertido.","error":"","text":"

Eis a questão: o que acontece quando nós invertemos todo o poema?

\n\n
poema.reverse\n
\n","load_code":"prev"}, "21":{"lang":"PT-BR","title":"Muita inversão","chapter":"N","answer":"^\\[\"Mais ainda (.+)","ok":"Sim, quase o que queremos","error":"","text":"

Então, todo o poema foi invertido, letra por letra. Eu realmente desejo inverter apenas as linhas.\nFazer com que a última linha seja a primeira, e a primeira seja a última.

\n\n

De trás para frente, mas não este de trás pra frente.

\n\n

Veja como:

\n\n
poema.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"PT-BR","title":"Cachos de Métodos Encadeados","chapter":"N","answer":"^Mais ainda eu quero (.+)","ok":"Bem mostrado, meu amigo!
O método join pega este array de linhas e junta todas elas em uma string.","error":"","text":"

Então, o que você vê? O que aconteceu aqui? Você digitou poema.lines.reverse e o que aconteceu?

\n\n

Duas coisas aconteceram. Você tornou o poema em uma lista usando o método lines.\nLines decide a forma como a string será dividida e converte isso em um array.

\n\n

Então, você inverteu esta lista. Você tinha cada linha. Você inverteu elas. É isso.

\n\n

Vamos colocar mais um método ao final aqui:

\n\n
puts poema.lines.reverse.join\n
\n\n

Combinando métodos desta forma é chamado de encadeamento de métodos.

\n","load_code":"prev"}, +"22":{"lang":"PT-BR","title":"Cachos de Métodos Encadeados","chapter":"N","answer":"Minha torrada voou da minha mão","ok":"Bem mostrado, meu amigo!
O método join pega este array de linhas e junta todas elas em uma string.","error":"","text":"

Então, o que você vê? O que aconteceu aqui? Você digitou poema.lines.reverse e o que aconteceu?

\n\n

Duas coisas aconteceram. Você tornou o poema em uma lista usando o método lines.\nLines decide a forma como a string será dividida e converte isso em um array.

\n\n

Então, você inverteu esta lista. Você tinha cada linha. Você inverteu elas. É isso.

\n\n

Vamos colocar mais um método ao final aqui:

\n\n
puts poema.lines.reverse.join\n
\n\n

Combinando métodos desta forma é chamado de encadeamento de métodos.

\n","load_code":"prev"}, "23":{"lang":"PT-BR","title":"De todos os sumários #3 está aqui agora","chapter":"Y","answer":"\\{\\}","ok":"Você criou um hash vazio !","error":"","text":"

Exclamações

\n\n

Métodos podem ter exclamações (e também interrogações) em seus nomes.\nIsto são apenas formas de explicar melhor qual é sua função. Nada de mais.

\n\n

Manipulação de string

\n\n

Buscar e alterar strings

\n\n

Encadeamento

\n\n

Encadeamento de métodos permite que você faça muito mais. Quebrar um poema, inverte-lo, remonta-lo:\npoema.lines.reverse.join

\n\n

A esta altura, talvez você queira brincar com o poema um pouco mais. A lista completa de todos os métodos\nde String está aqui

\n\n

Vá em frente e tente um pouco, coisas como: poema.downcase ou poema.swapcase

\n\n

Pronto ?

\n\n

Quando se sentir pronto para continuar, digite:

\n\n
livros = {}\n
\n","load_code":"prev"}, "24":{"lang":"PT-BR","title":"Um Pequenino Livro em Branco","chapter":"N","answer":"^(esplendido|muito_bom|mediocre|nao_tao_bom|lixo)$","ok":"Sim, este precisa de uma análise","error":"Use um dentre esplendido, muito_bom, mediocre, nao_tao_bom, lixo.
Não esqueça os dois pontos.","text":"

Você criou um hash vazio. Um hash é como um array, porém cada um dos seus elementos tem um nome.

\n\n

Nós iremos adicionar algumas análises de livrinhos ao nosso hash. Aqui está nosso sistema de classificação:

\n\n
    \n
  • :esplendido → uma obra prima
  • \n
  • :muito_bom → gostei, é, gostei
  • \n
  • :mediocre → tem partes boas e ruins
  • \n
  • :nao_tao_bom → notavelmente ruim
  • \n
  • :lixo → jamais recomendaria a alguém
  • \n
\n\n

Para classificar um livro, coloque o título entre colchetes e escreva a classificação após o sinal de igual. Por exemplo:

\n\n
livros["O Arco-Íris da Gravidade"] = :esplendido\n
\n\n
\n

Agora, acho que é justo lhe dizer que todas as lições do TryRuby são separadas uma das outras.\nEntão, se você sair escrevendo loucamente análises de livros aqui, você só poderá usa-las nessa lição.\nSe você deseja usar as suas análises na próxima lição, você deve copia-las e cola-las.\nNão se preocupe com isso, cada lição tem uma quantidade pré definida de coisas para você brincar.

\n
\n","load_code":"livros = {}"}, "25":{"lang":"PT-BR","title":"Mais Pequenos Pedaços de Análises","chapter":"N","answer":"[3-9]","ok":"Veja, o método length trabalha com strings, arrays e hashes","error":"","text":"

Vá em frente, preencha a lista com análises. E, se você quiser ver toda a lista, apenas digite: puts livros

\n\n

De novo, as classificações são: :esplendido, :muito_bom, :mediocre, :nao_tao_bom e :lixo

\n\n

Essas classificações não são strings. Quando você coloca dois pontos a frente de uma simples palavra, você obtém um symbol (símbolo).\nSímbolos são mais baratos que strings (em termos de custo de memória). Se você usar uma palavra várias e várias vezes no seu programa,\ntroque por um símbolo. Ao invés de ter milhares de cópias desta palavra na memória, o computador irá armazenar o símbolo apenas uma vez.

\n\n

Mais importante, um símbolo diz a você que isso não é apenas uma palavra, mas algo que tem significado para o seu programa.

\n\n

Entre com mais duas análises de livros, use livros.length para ver quantas análises já existem no hash:

\n\n
livros["Até o Fim"]  = :lixo\nlivros["Cores Vivas"] = :mediocre\n\nputs livros\n\nputs livros.length\n
\n","load_code":"livros = {\"O Arco-Íris da Gravidade\" => :esplendido}"}, "26":{"lang":"PT-BR","title":"Espera, Eu Gostei De Gravity's Rainbow?","chapter":"N","answer":"^(esplendido|muito_bom|mediocre|nao_tao_bom|lixo)$","ok":"Eu gostei bastante","error":"","text":"

Uma grande coisa sobre o Ruby é que nomes são frequentemente reutilizados, isso significa menos nomes para você lembrar.

\n\n

Relembre como nós recuperamos itens de um array utilizando um número:\nputs bilhete[1].

\n\n

Para um hash isso funciona da mesma forma, exceto que nós não usaremos um número para recuperar um elemento (mas sim um nome).

\n\n

Então, se você quiser olhar uma de suas análises antigas, de novo, coloque o título entre colchetes (mas dessa vez sem o sinal de igual).\nDesta forma:

\n\n
puts livros["O Arco-Íris da Gravidade"]\n
\n","load_code":"livros = {\"O Arco-Íris da Gravidade\" => :esplendido, \"Até o Fim\" => :lixo, \"Cores Vivas\" => :mediocre}"}, "27":{"lang":"PT-BR","title":"Hashes como pares","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Você encontrou as chaves","error":"","text":"

Tenha em mente que hashes não mantém as coisas ordenadas. Este não é o trabalho dele. Ele apenas\nfaz pares, os pares são: uma key (chave) e um value (valor).

\n\n

Em suas análises, o título do livro é a key, e a classificação é o value.

\n\n

Se você desejar ver apenas os titulos de todos os livros que você já análisou:

\n\n
livros.keys\n
\n\n

Você também pode tentar isso com .values ao invés de .keys.

\n","load_code":"prev"}, -"28":{"lang":"PT-BR","title":"Você é Áspero (Harsh)?","chapter":"N","answer":"\"mediocre\"","ok":"Ótimo, wow! Você fez um scorecard das suas análises.","error":"","text":"

Então, você está dando análises ásperas e injustas? Vamos dar uma pontuação com um novo hash classificacoes:

\n\n

Ok, vamos contar nossas análises. Apenas fique comigo. Digite:

\n\n
classificacoes = Hash.new {0}\n\nlivros.values.each { |classificacao|\n  classificacoes[classificacao] += 1\n}\n\nputs classificacoes\n
\n\n

A novidade em nosso código é o caracter pipe, provavelmente localizado a direita da tecla Shift\nno seu teclado.

\n\n

A linha += 1 significa: some 1 ao valor.

\n\n

Não se preocupe se você não entender tudo o que está acontecendo aqui. Isto será revelado mais tarde.

\n","load_code":"livros = {\"O Arco-Íris da Gravidade\" => :esplendido, \"Até o Fim\" => :lixo, \"Cores Vivas\" => :mediocre, \"Bumblebees\" => :mediocre}"}, +"28":{"lang":"PT-BR","title":"Você é Áspero (Harsh)?","chapter":"N","answer":":mediocre","ok":"Ótimo, wow! Você fez um scorecard das suas análises.","error":"","text":"

Então, você está dando análises ásperas e injustas? Vamos dar uma pontuação com um novo hash classificacoes:

\n\n

Ok, vamos contar nossas análises. Apenas fique comigo. Digite:

\n\n
classificacoes = Hash.new {0}\n\nlivros.values.each { |classificacao|\n  classificacoes[classificacao] += 1\n}\n\nputs classificacoes\n
\n\n

A novidade em nosso código é o caracter pipe, provavelmente localizado a direita da tecla Shift\nno seu teclado.

\n\n

A linha += 1 significa: some 1 ao valor.

\n\n

Não se preocupe se você não entender tudo o que está acontecendo aqui. Isto será revelado mais tarde.

\n","load_code":"livros = {\"O Arco-Íris da Gravidade\" => :esplendido, \"Até o Fim\" => :lixo, \"Cores Vivas\" => :mediocre, \"Bumblebees\" => :mediocre}"}, "29":{"lang":"PT-BR","title":"Um Cálculo","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

Uma das coisas incríveis que nós acabamos de usar é o bloco. Nós vamos explorar mais isso\nnesta e na próxima lição. Mas, basicamente, um bloco é um pedaço de código Ruby cercado por chaves {}.

\n\n

Vamos tentar outro bloco:

\n\n
5.times { print "Odelay! " }\n
\n\n

Blocos são sempre associados a métodos. Como o método times, que pega o bloco e roda o código\ndele várias e várias vezes. (No nosso exemplo: cinco vezes).

\n","load_code":""}, "30":{"lang":"PT-BR","title":"Você Pegou o Tempo?","chapter":"N","answer":"^[0-9]$","ok":"Seu tempo está correto!","error":"Rode o bloco de 0 a 9 vezes.","text":"

Como nós vimos em nosso primeiro exemplo com um bloco (quando contamos classificações) nós podemos passar um valor para o bloco.\nQuais valores são passados é determinado pelo método que está rodando o bloco.

\n\n

Os valores que são recebidos pelo bloco são colocados em uma variável que tem o nome definido no ínicio do bloco,\nentre dois símbolos pipe: |

\n\n

Vamos tentar isso com este bloco:

\n\n
5.times { |vez|\n  puts vez\n}\n
\n\n

Aqui, o método .times (significa vezes) envia o valor para a variável |vez| . Porém, note que a variável vez só é conhecida dentro do bloco.

\n\n
\n

Você notou que você pode dividir o código em várias linhas? Isto torna o código um pouco mais fácil de ser lido.

\n
\n","load_code":""}, "31":{"lang":"PT-BR","title":"Agora Desembarcando no Sumário #4","chapter":"Y","answer":"","ok":"","error":"","text":"

Esta última lição é um pouco mais longa. Você provavelmente usou três minutos aprendendo sobre:

\n\n

Hashes

\n\n

O pequeno dicionário com páginas chaves: {}

\n\n

Símbolos

\n\n

Pequenos, eficientes palavras de código com dois pontos, como: :esplendido

\n\n

Blocos

\n\n

Trechos de código que podem ser usados com muitos métodos do Ruby. Aqui o código usado para\nconstruir o scorecard:\nlivros.values.each { |classificacao| classificacoes[classificacao] += 1 }

\n\n

Próximo

\n\n

Na próxima lição nós iremos entrar um pouco mais a fundo nos métodos.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"PT-BR","title":"O Amadurecido Fruto de Sua Própria Criação","chapter":"N","answer":"^Megera domada","ok":"Isso vai mostrar essas megeras","error":"","text":"

Um novo método nasceu. Vamos usa-lo agora:

\n\n
domar 5\n
\n","load_code":"def domar(numero_de_megeras);numero_de_megeras.times{puts \"Megera domada\"};end;"}, "36":{"lang":"PT-BR","title":"Dar e Tomar","chapter":"N","answer":"\\d+","ok":"Certo. Bravo.","error":"","text":"

Muitos métodos não só precisam de alguns parâmetros de entrada, mas também irão devolver algo.\nEu mudei o nosso método um pouco, assim ele irá retornar um valor para você. Tente isso:

\n\n
def domar( numero_de_megeras )\n  numero_de_megeras.times {\n    puts "Megera domada"\n  }\n  return numero_de_megeras\nend\n\nputs domar(3)\n
\n\n

Retorno (Return)

\n\n

E, uma vez que você está ficando avançado e capaz aqui, mais uma dica:\nvocê pode omitir a palavra return da última linha do método.\nO Ruby irá automagicamente retornar o valor da última variável usada dentro do método.

\n\n

Assim, nós podemos mudar a última linha para apenas numero_de_megeras.

\n\n

Mas, uma vez que o método .times também retorna o numero_de_megeras nós podemos\nremover a última linha inteira. De fato, nosso método original já fazia o que nós queríamos!

\n","load_code":""}, "37":{"lang":"PT-BR","title":"Olá, Quem Está Ai? E Sumário #5 Segura o Chapéu!","chapter":"Y","answer":"","ok":"","error":"","text":"

Muito bem, muito bem, muito bem, muito bem!

\n\n

Verdadeiramente, verdadeiramente, verdadeiramente, verdadeiramente, verdadeirameeeeeente!

\n\n

Aqui estão os últimos minutos da nosa vida revisados:

\n\n

Métodos

\n\n

Métodos podem ser definidos com def e têm um nome. Métodos tornam os seus programas mais curtos\ne fáceis de ler.

\n\n

Parâmetros

\n\n

Métodos podem receber parâmetros.

\n\n

Retornar valores

\n\n

Métodos (quase) sempre retornam valores.

\n\n

Agora

\n\n

(Ser) ou não (ser) não é mais uma dúvida para você. Você está pronto para um pouco mais de Shakespare?

\n","load_code":""}, -"38":{"lang":"PT-BR","title":"O mundo é nossa ostra","chapter":"N","answer":"^\\{\\\"William","ok":"Bom. Um pouco díficil de ler.","error":"","text":"

Até agora, rodamos apenas programas que utilizam apenas coisas digitadas por nós mesmos.\nO que é bom, quero dizer que OdeLaying foi épico. Mas a era da internet é sobre um tempo\nem que nos esforçamos para incluir o resto do mundo em nossos programas.

\n\n

Muitos, muitos, muitos sites estão disponíveis para você solicitar informação. Por exemplo, este link\nirá lhe fornecer todo o atual Google news feeds\nsobre Ruby.

\n\n

Seu browser provavelmente irá exibi-lo corretamente para você. Se você olhar o código fonte\n(digite: control-U), você verá uma string longa de um texto estranhamente formatado. No exemplo do Google,\neste texto está no formato rss

\n\n

Formatos

\n\n

Existem muitos outros formatos, com nomes estranhos, disponíveis e utilizados na web. Como:\nhtml, xml e json. Sim, mesmo este website tem um monte desses.

\n\n

Eu preparei um método para você que lhe permitirá buscar, da internet, uma lista com os trabalhos concluídos de\nWilliam Shakespeare.\n(Não se preocupe, isto vem do mesmo webserver que este site roda, então não estamos incomodando ninguém).

\n\n

Pegue os dados com:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"PT-BR","title":"O mundo é nossa ostra","chapter":"N","answer":"^\\{\\\"William","ok":"Bom. Um pouco díficil de ler.","error":"","text":"

Até agora, rodamos apenas programas que utilizam apenas coisas digitadas por nós mesmos.\nO que é bom, quero dizer que OdeLaying foi épico. Mas a era da internet é sobre um tempo\nem que nos esforçamos para incluir o resto do mundo em nossos programas.

\n\n

Muitos, muitos, muitos sites estão disponíveis para você solicitar informação. Por exemplo, este link\nirá lhe fornecer todo o atual Google news feeds\nsobre Ruby.

\n\n

Seu browser provavelmente irá exibi-lo corretamente para você. Se você olhar o código fonte\n(digite: control-U), você verá uma string longa de um texto estranhamente formatado. No exemplo do Google,\neste texto está no formato rss

\n\n

Formatos

\n\n

Existem muitos outros formatos, com nomes estranhos, disponíveis e utilizados na web. Como:\nhtml, xml e json. Sim, mesmo este website tem um monte desses.

\n\n

Eu preparei um método para você que lhe permitirá buscar, da internet, uma lista com os trabalhos concluídos de\nWilliam Shakespeare.\n(Não se preocupe, isto vem do mesmo webserver que este site roda, então não estamos incomodando ninguém).

\n\n

Pegue os dados com:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"PT-BR","title":"Noble Kinsmen","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"Assim é bem melhor","error":"","text":"

Ok, agora nós temos a lista de peças obtidas da internet. A lista está em formato json.\nFelizmente, para nós, o Ruby, gentilmente, fornece um método para converter json em Hash.\nO método get_shakey já faz isso para nós

\n\n

Mas, uma vez que a estrutura do json é convertida em um hash, ela se torna um pouco difícil de ler.\nVamos então escrever um método para exibir as peças de forma legível.

\n\n

Se você olhar a lista de peças cuidadosamente, você verá que há um tipo de estrutura identada.\nAtualmente, isso é comum em dados que você obtém da internet. Parece como isso:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Para listar as peças, primeiro nós temos que acessar o elemento do topo do hash, “William Shakespeare”, pelo seu nome.\nEm seguida, temos que iterar através de cada elemento abaixo deste.

\n\n

O Ruby tem um método para iterar. Ele é chamado de each (significa cada). Nós já o vimos antes\nquando criamos nosso sistema de avaliação de livros.

\n\n

Tudo que o método each retorna é passado para o bloco:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"PT-BR","title":"Tudo junto agora","chapter":"N","answer":"^4$","ok":"Sim, Shakespeare escreveu 4 peças em 1591","error":"A resposta para o ano 1591 deve ser 4","text":"

Agora, suponha que nós desejamos saber apenas os nomes e a quantidade de peças escritas\npor Shakespeare em um determinado ano.

\n\n

O Ruby nos permite selecionar (select) valores do hash. O método select usa um bloco\npara nos deixar definir o que selecionar, e retorna o que for encontrado.

\n\n

Nós podemos usar o resultado retornado pelo método select no método each simplesmente\nadicionando-o após o bloco do select. Este é outro exemplo de encadeamento de métodos, que nós\nvimos antes ao inverter o poema.

\n\n

Eu preparei o método count_plays (plays significa peças) para você. Veja se você consegue descobrir\nquantas peças foram escritas por Shakespeare no ano 1591. Tente isso:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

Você notou que eu encadeei o método count ao final do método each? Isto nos dá o valor\nde retorno para o método count_plays.

\n\n

Existe uma outra possibilidade de encadeamento aqui. Veja esta linha s = get_shakey.\nVocê pode adicionar o [“William Shakespeare”].select { |k, v| ao final do get_shakey\n(nesse caso, não é preciso colocar o ponto).

\n","load_code":"prev"}, "41":{"lang":"PT-BR","title":"Tudo Fica Bem Quando Termina Bem","chapter":"N","answer":"All's Well That Ends Well","ok":"True","error":"Use 1605 como segundo parâmetro","text":"

Ok, nós pegamos alguns dados da internet, nós selecionamos o que nós queríamos e imprimimos na tela.\nO que falta melhorar? Nós poderíamos ter impresso os resultados de forma um pouco mais bonita. Como adicionar\no ano e alinhar títulos e anos.

\n\n

Isso significa imprimir vários valores em uma linha. O Ruby possui um jeito puro\nde fazer isso. É exatamente como imprimir uma string: puts “Olá, meu nome é Ricardo”.\nMas, ao invés de utilizarmos o valor literal Ricardo, nós usaremos o valor da variável.

\n\n

Em primeiro lugar, substitua Ricardo por #{}. Se o Ruby ver o símbolo hash # seguido de chaves {\nele procurará por uma variável entre a abertura e o fechamento da chave }.\nNós podemos usa-lo desta forma: “Olá, meu nome é #{nome}”

\n\n

Vamos alterar um pouco o nosso código

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

Eu adicionei .ljust(30) ao título. Desta forma o título é justificado a esquerda com um minímo de\n30 caracteres (assim os anos ficam alinhados).

\n\n

Veja se você pode mudar a saída do programa para que ele exiba as peças desta forma: 1600 -> As You Like It

\n\n

Tudo Fica Bem Quando Termina Bem ? Ei, nós não terminamos ainda, mas o fim está a vista !

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"PT-BR","title":"As Coisas Das Quais Os Apps São Feitos","chapter":"N","answer":"","ok":"","error":"","text":"

Você abriu a nova BlurbTM class. Do que a entrada do seu blog é feita?\nDe conteúdo, claro. Também, a hora em que o BlurbTM foi postado. E o humor.

\n\n

Ok, então você tem a primeira linha da sua classe, aqui está o resto:

\n\n
class Blurb\n  attr_accessor :conteudo, :hora, :humor\nend\n
\n\n

Nomes de classes sempre começam com letra maiúscula.

\n\n

(Continua sem saída na tela)

\n","load_code":""}, "48":{"lang":"PT-BR","title":"Acessores São Os Membros Pendurados","chapter":"N","answer":"Blurb:","ok":"Meu primeiro Blurb","error":"","text":"

Hey, boa classe cara. Você tem uma nova classe BlurbTM.

\n\n

Na definição de classe, você usou o método chamado attr_accessor.\nExistem vários métodos de attributos como esse que adicionam pequenas configurações as classes.\nEsses atributos são apenas variáveis amarradas a classe.

\n\n

Pense desta forma. A classe é uma pessoa. Aquela coisa humana em forma de estrela lá fora.\nE os atributos são os membros pendurados, as diferentes partes que mantém o corpo de pé e\nque permitem que as pessoas apertem as mãos umas das outras.

\n\n

Agora

\n\n

Para criar um BlurbTM e definir seu conteúdo:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.conteudo = "Hoje, Mount Hood foi roubado!"\n
\n","load_code":"class Blurb;attr_accessor :conteudo,:tempo,:humor;end"}, "49":{"lang":"PT-BR","title":"Um Objeto, Este Pequeno Pacote Puro","chapter":"N","answer":"Blurb:","ok":"Blurb Atualizado","error":"","text":"

Vá em frente e defina o tempo e o humor do seu BlurbTM:

\n\n
blurb1.tempo = Time.now\nblurb1.humor = :doente\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.conteudo=\"Hoje, Mount Hood foi Roubado!\""}, -"50":{"lang":"PT-BR","title":"Apressando as Coisas","chapter":"N","answer":"^\\d{4}","ok":"Notável","error":"","text":"

Legal, seu app é sensacional. Ei, vamos tornar as coisas um pouco mais fáceis para você.\nVocê não quer definir a hora desta forma toda vez que você postar um BlurbTM.

\n\n

Você quer apenas digitar o conteúdo e definir o humor, certo?

\n\n

Vamos adicionar um método initialize na nossa classe. Este método é chamado sempre que um novo BlurbTM é criado.\nAo mesmo tempo, nós queremos limitar o tamanho do conteúdo do BLurbTM para apenas 40 caracteres.

\n\n
class Blurb\n  attr_accessor :conteudo, :tempo, :humor\n\n  def initialize(humor, conteudo="")\n    @tempo    = Time.now\n    @conteudo = conteudo[0..39]\n    @humor    = humor\n  end\nend\n\nBlurb.new.tempo\n
\n\n

(Este parâmetro conteudo=“”__ está aqui para garantirmos que o conteúdo é uma string,\nmesmo se nenhum conteúdo for passado como parâmetro para o método initialize)

\n","load_code":""}, +"50":{"lang":"PT-BR","title":"Apressando as Coisas","chapter":"N","answer":"^\\d{4}","ok":"Notável","error":"","text":"

Legal, seu app é sensacional. Ei, vamos tornar as coisas um pouco mais fáceis para você.\nVocê não quer definir a hora desta forma toda vez que você postar um BlurbTM.

\n\n

Você quer apenas digitar o conteúdo e definir o humor, certo?

\n\n

Vamos adicionar um método initialize na nossa classe. Este método é chamado sempre que um novo BlurbTM é criado.\nAo mesmo tempo, nós queremos limitar o tamanho do conteúdo do BLurbTM para apenas 40 caracteres.

\n\n
class Blurb\n  attr_accessor :conteudo, :tempo, :humor\n\n  def initialize(humor, conteudo="")\n    @tempo    = Time.now\n    @conteudo = conteudo[0..39]\n    @humor    = humor\n  end\nend\n\nBlurb.new(:sick).tempo\n
\n\n

(Este parâmetro conteudo=“”__ está aqui para garantirmos que o conteúdo é uma string,\nmesmo se nenhum conteúdo for passado como parâmetro para o método initialize)

\n","load_code":""}, "51":{"lang":"PT-BR","title":"Você Ensinou Seu App a Desprezar Coisas Sem Valor","chapter":"N","answer":"Blurb:","ok":"Blurb adicionado","error":"","text":"

Você viu como usamos os simbolos arroba dentro da classe (@tempo)?

\n\n

Fora da classe, nós usamos o acessor:

\n\n
\n

blurb.tempo = Time.now

\n
\n\n

mas dentro nós usamos a variável objeto:

\n\n
\n

@tempo = Time.now

\n
\n\n

Eles são exatamente a mesma coisa, mas são representados em dois locais diferentes do programa.

\n\n

Crie outro BlurbTM

\n\n

Quando um novo BlurbTM é criado, o método initialize é usado para verificar\npor algum argumento para o new.

\n\n

Uh, nós precisamos de dois argumentos:

\n\n
Blurb2 = Blurb.new :confuso, "Eu não posso acreditar que Mt. Hood foi roubado!"\n
\n","load_code":"class Blurb;attr_accessor :conteudo,:tempo,:humor;def initialize(humor, conteudo=\"\");@tempo=Time.now;@conteudo=conteudo[0..39];@humor=humor;end;end;blurb1=Blurb.new(:doente,\"Hoje, Mount Hood foi roubado!\")"}, "52":{"lang":"PT-BR","title":"Uma Girafa Não Roubou o Sumário #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Aha! Você está aqui. E inteiro. Nós vamos continuar a fazer o seu app real, mas enquanto isso,\nvamos revisar ok?

\n\n

Classes

\n\n

Tudo em Ruby é algum tipo de objeto. Classes explicam objetos, como um certo tipo de objeto funciona.\nPor exemplo, você criou alguns objetos BlurbTM e esses objetos são explicados na classe Blurb.\nEm outras palavras: você os chama de objetos Blurb.\nVocê pode usar classes (meio que) para modelar objetos da vida real

\n\n

Acessores

\n\n

Acessores são variáveis atreladas a um objeto que podem ser usadas fora do objeto.\n(blurb2.tempo = Time.now)

\n\n

Variáveis de objeto

\n\n

Variáveis de objeto são as mesmas variáveis que você está utilizando com os acessores, porém, dentro do objeto.\n(@tempo = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confuso, \"Eu não posso acreditar que Mt. Hood foi roubado!\""}, "53":{"lang":"PT-BR","title":"Seu próprio gramado","chapter":"N","answer":"Blurbalizer:","ok":"Meu app foi criado","error":"","text":"

Ok, vamos embrulhar as coisas, garoto. Este é o último capítulo da EMOCIONANTE e épica história do Try Ruby!\nAgora que você já sentiu o gostinho de como tudo funciona, como nós vamos usar isso em volta da casa e no freezer\nda sua mercearia?\nVocê é uma grande pessoa (uma das minhas favoritas), mas você precisa de orientação.

\n\n

Vamos finalizar seu app

\n\n

Seu app tem entradas, mas não está completo.\nEle ainda precisa de um título, algum lugar para armazenar todos os BlurbsTM e uma timeline para funcionar adequadamente.

\n\n

Tente advinhar, nós vamos usar outra classe. Eu estou lhe dando todo o código da nova classe de uma vez.\nEstude-a no seu tempo, sem pressa.\nEu não estou com pressa, eu irei esperar você para a sua próxima lição.

\n\n
class Blurbalizer\n  def initialize(titulo)\n    @titulo  = titulo\n    @blurbs = [] # Um array fresquinho e limpo\n                 # para armazenar os Blurbs\n  end\n\n  def adicionar_um_blurb(humor, conteudo)\n    # O << significa adicionar ao array\n    @blurbs << Blurb.new(humor, conteudo)\n  end\n\n  def exibir_timeline\n    puts "Blurbify: #{@titulo} tem #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.tempo\n    }.reverse.each { |t|\n      puts "#{t.conteudo.ljust(40)} #{t.tempo}"\n    }\n  end\nend\n\nmeuApp = Blurbalizer.new "O Grande Blurb"\n
\n","load_code":"class Blurb;attr_accessor :conteudo,:tempo,:humor;def initialize(humor, conteudo=\"\");@tempo=Time.now;@conteudo=conteudo[0..39];@humor=humor;end;end"}, diff --git a/source/try_ruby_ru.json b/source/try_ruby_ru.json index 11edd0e5..d5e75ff2 100644 --- a/source/try_ruby_ru.json +++ b/source/try_ruby_ru.json @@ -17,15 +17,15 @@ "17":{"lang":"RU","title":"Элементы","chapter":"N","answer":"^(12|35|47)$","ok":"Хорошо","error":"Почти","text":"

Мы сохранили номера в переменную, а как их получить обратно ?

\n\n

Мы уже видели, как мы можем получить максимальный элемент, используя метод max. Также Вы можете\nполучить first(первый) или last(последний) элемент списка.\nА что если Вы хотите получить какой-то конкретный элемент?

\n\n

[ ]

\n\n

Ruby использует [ ], чтобы нацелиться на элемент.\nКвадратные скобки очень распространены в Ruby.\nОни означают: “Я ищу ____ ”, Готов, целься!

\n\n

Давайте получим все номера из списка:

\n\n
puts ticket[0]\nputs ticket[1]\nputs ticket[2]\n
\n\n

Почему мы используем [0], [1], [2]?

\n\n

А не [1], [2] and [3]? Это какой-то японский дзен?\nНет, во многих языках программирования отсчет идет с нуля. Это не только особенность Ruby.

\n\n
\n

Небольшое напоминание: Вы можете использовать кнопку copy.

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"RU","title":"Итоги #2 Что тут у нас?","chapter":"Y","answer":"(.+)","ok":"В рифму?","error":"","text":"

Сейчас посмотрим.

\n\n

Ошибки

\n\n

Если вы попробуете сделать число наоборот или другое что-то странное, Ruby скажет об этом.

\n\n

Массивы

\n\n

Массивы - это списки, хранящие элементы в определенной последовательности.\nМы уже знаем, как создать массив и получить элементы из него.

\n\n

Переменные

\n\n

Переменные сохраняют значения и дают им имена. Мы используем символ равенства, \nчтобы проделать это. Как тут:\nticket = [14, 37, 18].

\n\n

2/8

\n\n

Всего тут 8 разделов. 2 уже позади! Не так-то и сложно, да?

\n\n

Давайте немного сменим направление. Я практиковался в поэзии и положил\nрезультат в переменную poem. Взгляните. Наберите:

\n\n
puts poem\n
\n","load_code":"poem = \"Мой тост вылетел из моей руки. \\nИ мой тост отправился на луну. \\nНо когда я увидел это по телевизору, \\nЗаправляя наш флаг на комету Галлея, \\nПосле того, как я все-таки захотел съесть его\\n\""}, "19":{"lang":"RU","title":"К сожалению, Вам не понравилась поэзия :(","chapter":"N","answer":"(toast){0}","ok":"Прекрасно!","error":"","text":"

Все в порядке. Это не обязательно должно было понравиться Вам. Попробуйте его, будьте моим гостем. Вместо тоста может быть\nпирог или что угодно. Попробуйте это, чтобы увидеть новый вариант поэмы:

\n\n
poem.gsub("тост", "медовик")\n
\n\n

Метод gsub это сокращение global substitute (заменитель). Он заменяет все совпадения “тост” на\n“медовик”.

\n","load_code":"prev"}, -"20":{"lang":"RU","title":"Готов, целься!","chapter":"N","answer":"^\\nоге ьтсеъс летохаз (.+)","ok":"Конечно, все стихотворение развернуло задом наперед.","error":"","text":"

Вот вопрос, что произойдет:

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"RU","title":"Готов, целься!","chapter":"N","answer":"икур йеом зи летелыв тсот йоМ","ok":"Конечно, все стихотворение развернуло задом наперед.","error":"","text":"

Вот вопрос, что произойдет:

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"RU","title":"Слишком много слов наоборот","chapter":"N","answer":"^\\[\"После того, как я (.+)","ok":"Да, то что нужно!","error":"","text":"

Что ж, все стихотворение стало задом наперед. Слово за словом! Но я хочу всего лишь сделать это для строк.\nПереместим первую строку в конец, а последнюю в начало.

\n\n

Теперь делаем так:

\n\n
poem.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"RU","title":"Еще немного методов","chapter":"N","answer":"^После того, как я (.+)","ok":"Отлично, мой друг!
Метод join взял строки из этого массива и соединил их в строку.","error":"","text":"

Что Вы видите? Что произошло? Вы набрали poem.lines.reverse и что случилось?

\n\n

Два события произошло. Первое: вы разбили стихотворения на строки, используя метод lines, \nи получили массив из них.

\n\n

Затем Вы развернули этот лист задом наперед. Вот и все!

\n\n

Давайте добавим еще один метод в конец:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбинирование методов называется: цепочка методов.

\n","load_code":"prev"}, +"22":{"lang":"RU","title":"Еще немного методов","chapter":"N","answer":"Мой тост вылетел из моей руки","ok":"Отлично, мой друг!
Метод join взял строки из этого массива и соединил их в строку.","error":"","text":"

Что Вы видите? Что произошло? Вы набрали poem.lines.reverse и что случилось?

\n\n

Два события произошло. Первое: вы разбили стихотворения на строки, используя метод lines, \nи получили массив из них.

\n\n

Затем Вы развернули этот лист задом наперед. Вот и все!

\n\n

Давайте добавим еще один метод в конец:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбинирование методов называется: цепочка методов.

\n","load_code":"prev"}, "23":{"lang":"Ru","title":"Итоги #3 Здесь и сейчас","chapter":"Y","answer":"\\{\\}","ok":"Вы создали пустой hash (словарь)!","error":"","text":"

Восклицательный знак

\n\n

Методы могут иметь восклицательные знаки(и также вопросительные) в своем имени.\nОни для более понятного объяснения, что они делают. Ничего страшного.

\n\n

Манипуляции со строками

\n\n

Поиск и изменение строк

\n\n

Цепочки

\n\n

Цепочки методов позволяют сделать намного больше. Разбить стихотворение, развернуть его, воссоединить в строку:\npoem.lines.reverse.join

\n\n

На этом этапе, Вы можете посмотреть про ВСЕ методы для строк тут.

\n\n

Вернитесь и попробуйте например это:\npoem.downcase или poem.swapcase

\n\n

Готовы?

\n\n

Когда вы будете готовы двигаться дальше, наберите:

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"RU","title":"Пустой hash","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Вот и новый отзыв.","error":"Используйте один из: splendid, quite_good, mediocre, quite_not_good, abysmal.
Не забывайте про двоеточие.","text":"

Мы создали пустой hash. Hash - это как массив, только у каждого элемента есть имя.

\n\n
\n

Примечание переводчика: в русскоязычном сообществе слово hash никак не переводится. Если Array переводят как массив, то Hash остается хэш.\nНазвание hash идет от hash-функции, на основе которой работает hash, и которая позволяет очень быстро находить элемент по ключу(имени). Но для того, чтобы использовать hash, нам не обязательно этого знать.

\n
\n\n

Мы собираемся написать несколько миниатюрных отзывов в новый hash. Вот наша рейтинговая система:

\n\n
    \n
  • :splendid → ШЕДЕВР!
  • \n
  • :quite_good → Понравилась!
  • \n
  • :mediocre → На троечку!
  • \n
  • :quite_not_good → Плохо!
  • \n
  • :abysmal → УЖАСНО!
  • \n
\n\n

Чтобы оценить книгу, добавьте название в квадратных скобках и поставьте оценку после знака равно.\nПример:

\n\n
books["Война и мир"] = :splendid\n
\n\n
\n

Сейчас, я считаю необходимым сказать, что все уроки в TryRuby отделены друг от друга.\nТак, если вы решили сделать очень много отзывов, то использовать их все равно сможете только в этом уроке.\nЕсли вы хотите использовать свои отзывы в следующем уроке, вы должны скопировать их и вставить.\nНе беспокойтесь об этом слишком сильно, у каждого урока есть много предопределенных вещей для вас, чтобы поиграть.

\n
\n","load_code":"books = {}"}, "25":{"lang":"RU","title":"Еще несколько простых отзывов","chapter":"N","answer":"[3-9]","ok":"Отлично, смотрите: метод length работает на строках, словарях и массивах.","error":"","text":"

Продолжайте, заполните его отзывами. И, если вы хотите увидеть весь список, просто введите: puts books

\n\n

Опять же, возможные оценки: :splendid, :quite_good, :mediocre, :quite_not_good and :abysmal.

\n\n

Эти оценки не являются строками. Когда вы помещаете двоеточие перед простым словом, вы получаете Symbol.\nSymbol дешевле строк (с точки зрения компьютерной памяти). Если вы используете слово снова и снова в своей программе,\nиспользуйте Symbol. Вместо того, чтобы иметь тысячи копий этого слова в памяти, Ruby будет хранить Symbol только\nодин раз.

\n\n

Что еще более важно, Symbol говорит вам, что это не просто старое слово, но и то, что оно имеет смысл в вашей программе.

\n\n
\n

Примечание переводчика: в английском языке есть два слова: Symbol и Chars, и оба переводятся на русский как символ(ы).
\nВ контексте Ruby Symbol правильно было бы перевести как “идентификатор”, но в разговоре используют слово символ. \nПоэтому если в контексте Ruby вы услышите “символ”, то скорее всего это Symbol, идентификатор, который записывается как :good, и является оптимизированной для памяти строкой

\n
\n\n

Введите еще 2 отзыва, используйте books.length, чтобы узнать, сколько отзывов в hash:

\n\n
books["The deep end"]  = :abysmal\nbooks["Living colors"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid}"}, "26":{"lang":"RU","title":"Погодите, я не хуже Войны и мир?","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Мне нравится","error":"","text":"

Одна особенность Ruby заключается в том, что имена часто используются повторно, что означает меньшее количество имен, которые вам нужно запомнить.

\n\n

Помните, как мы извлекали элементы из массива с помощью числа:\n_puts ticket [1] _.

\n\n

Для hash это работает одинаково, за исключением того, что мы не используем число, чтобы получить элемент, а имя(ключ, key, прим. переводчика).

\n\n

Итак, если вы хотите посмотреть один из своих старых отзывов, снова введите название в квадратных скобках. Но не пишите равенство.\nИменно так:

\n\n
puts books["Война и мир"]\n
\n","load_code":"books = {\"Война и мир\" => :splendid, \"Отцы и дети\" => :abysmal, \"Идиот\" => :mediocre}"}, "27":{"lang":"RU","title":"Словари это пары","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Вы нашли ключи","error":"","text":"

Помните, что словари не хранят элементы в последовательности. Это не их задача.\nОни создают пару: ключ(key) : значение(value)

\n\n

В ваших отзывах, название книги - это ключ, а оценка - значение.

\n\n

Если вы хотите увидеть все названия книг, введите:

\n\n
books.keys\n
\n\n

Также попробуйте использовать .values вместо .keys.

\n","load_code":"prev"}, -"28":{"lang":"RU","title":"А ты суров?","chapter":"N","answer":"\"mediocre\"","ok":"Отлично, круто! Вы создали таблицу своих оценок","error":"","text":"

Вы выдаете суровые, несправедливые отзывы? Давайте посчитаем их в новом hash ratings:\nСледуя за мной, наберите:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Прямой линией в коде является символ pipe , вероятно, расположенный над клавишей Enter\nна клавиатуре.

\n\n

Эта строка _ + = 1_ означает: увеличить значение на 1.

\n\n

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

\n","load_code":"books = {\"Война и мир\" => :splendid, \"Отцы и дети\" => :abysmal, \"Идиот\" => :mediocre, \"Евгений Онегин\" => :amazing}"}, +"28":{"lang":"RU","title":"А ты суров?","chapter":"N","answer":":mediocre","ok":"Отлично, круто! Вы создали таблицу своих оценок","error":"","text":"

Вы выдаете суровые, несправедливые отзывы? Давайте посчитаем их в новом hash ratings:\nСледуя за мной, наберите:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Прямой линией в коде является символ pipe , вероятно, расположенный над клавишей Enter\nна клавиатуре.

\n\n

Эта строка _ + = 1_ означает: увеличить значение на 1.

\n\n

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

\n","load_code":"books = {\"Война и мир\" => :splendid, \"Отцы и дети\" => :abysmal, \"Идиот\" => :mediocre, \"Евгений Онегин\" => :amazing}"}, "29":{"lang":"RU","title":"Подсчет","chapter":"N","answer":".+","ok":"Ура!","error":"","text":"

Одна из потрясающих вещей, которую мы использовали это block(блок). Мы изучим подробнее в\nэтом и следующем уроке. Но, в основном, блок - это немного кода на Ruby, окруженного фигурными\nскобками.

\n\n

Давайте попробуем создать другой блок:

\n\n
5.times { print "Ура! " }\n
\n\n

Блоки всегда привязаны к методам. Как метод times, который берет блок и запускает\nкод снова и снова. (В нашем примере: пять раз.)

\n","load_code":""}, "30":{"lang":"RU","title":"Есть минутка?","chapter":"N","answer":"[0-9]$","ok":"Ты сделал все верно!","error":"Выполните блок 0-9 раз","text":"

Как мы видели в первом примере с блоком (при подсчете оценок), мы можем передать значение блоку. Значение, которое\nвставляется определяется методом, который запускает блок.

\n\n

Значения, которые принимает блок, помещаются в имя переменной в начале блока,\nмежду двумя символами pipe: |

\n\n

Попробуем это с помощью этого блока:

\n\n
5.times { |time|\n    puts time\n}\n
\n\n

Здесь метод .times отдает значение переменной |time|. Но имейте в виду, что эта переменная известна\nтолько внутри блока

\n\n
\n

Заметили, что вы можете писать код на нескольких строках?

\n
\n","load_code":""}, "31":{"lang":"RU","title":"Подводя итоги #4","chapter":"Y","answer":"","ok":"","error":"","text":"

Этот урок был немного длиннее. Вы, вероятно, потратили на три минуты больше на его изучение:

\n\n

Словари

\n\n

Самый простой пример словаря: {}

\n\n

Символы

\n\n

Крошечные, эффективные кодовые слова с двоеточием, например: :splendid

\n\n

Блоки

\n\n

Куски кода, которые можно привязать ко многим методам Ruby. Вот код, который вы использовали для\nсоздания таблицы оценок:\n books.values.each { |rate| ratings[rate] += 1 }

\n\n

Далее

\n\n

В следующих уроках мы еще глубже погрузимся в методы

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"RU","title":"Плод вашего собственного творения","chapter":"N","answer":"^Tamed a shrew","ok":"Вот и все!","error":"","text":"

Новый метод рожден. Попробуем его использовать:

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"Tamed a shrew\"};end;"}, "36":{"lang":"RU","title":"Давай и бери","chapter":"N","answer":"\\d+","ok":"На уровне! Браво!","error":"","text":"

Большинство методов не только требуют ввода некоторых параметров, но и возвращают что-то обратно.\nЯ немного изменил наш метод, чтобы он вернул вам значение. Попробуй:

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

Возвращаемое значение

\n\n

И, поскольку вы настолько продвинуты и способны, еще один совет:\nвы можете опустить слово return из последней строки метода.\nRuby автоматически вернет последнее значение, которое использовалось внутри метода.

\n\n

Так мы можем изменить последнюю строку на это: number_of_shrews.

\n\n

Но по-прежнему метод .times также может справиться с этой задачей.\nТак что наш новый метод делает то, что мы уже давно можем и без него!

\n","load_code":""}, "37":{"lang":"RU","title":"Кто здесь? Итоги #5 Снимите шляпу!","chapter":"Y","answer":"","ok":"","error":"","text":"

Отлично, Отлично, Отлично!

\n\n

Круто! Круто! Круууууто!

\n\n

Вот что мы еще узнали:

\n\n

Методы

\n\n

Методы могут быть определены с помощью def и у них есть имя. Методы\nделают вашу программу короче и проще для чтения.

\n\n

Параметры

\n\n

У методов могут быть параметры

\n\n

Возвращаемое значение

\n\n

Методы зачастую возвращают какое-то значение

\n\n

А сейчас

\n\n

Готовы почитать немного Шекспира?

\n","load_code":""}, -"38":{"lang":"RU","title":"Мир - наша устрица","chapter":"N","answer":"^\\{\\\"William","ok":"Хорошо, но читать тяжело!","error":"","text":"

До сих пор мы запускали программы, которые используют только те вещи, которые мы набрали сами.\nЭто классно, но сейчас эпоха интернета, а значит можно использовать эти данные.

\n\n

Много, много веб-сайтов в сети, а значит у всех них можно запросить информацию. Например:\nэта ссылка даст вам все последние Новости из Гугла\nо Ruby.

\n\n

Ваш браузер скорее всего отобразит это красиво. Но если вы посмотрите на исходный код,\n(нажмите: control-U) вы увидите сложный текст в формате rss.

\n\n

Форматы

\n\n

Всего очень много форматов со сложными названиями в сети, такие как:\nhtml, xml and json. Ага, многие веб-сайты используют их.

\n\n

Я подготовил для вас метод, который выберет список полных работ Уильяма\nШекспира из Интернета.\n(Не волнуйтесь, что на самом деле это происходит с того же сервера, на котором работает этот веб-сайт, поэтому\nмы никого не беспокоим.)

\n\n

Получите данные с помощью:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"RU","title":"Мир - наша устрица","chapter":"N","answer":"^\\{\\\"William","ok":"Хорошо, но читать тяжело!","error":"","text":"

До сих пор мы запускали программы, которые используют только те вещи, которые мы набрали сами.\nЭто классно, но сейчас эпоха интернета, а значит можно использовать эти данные.

\n\n

Много, много веб-сайтов в сети, а значит у всех них можно запросить информацию. Например:\nэта ссылка даст вам все последние Новости из Гугла\nо Ruby.

\n\n

Ваш браузер скорее всего отобразит это красиво. Но если вы посмотрите на исходный код,\n(нажмите: control-U) вы увидите сложный текст в формате rss.

\n\n

Форматы

\n\n

Всего очень много форматов со сложными названиями в сети, такие как:\nhtml, xml and json. Ага, многие веб-сайты используют их.

\n\n

Я подготовил для вас метод, который выберет список полных работ Уильяма\nШекспира из Интернета.\n(Не волнуйтесь, что на самом деле это происходит с того же сервера, на котором работает этот веб-сайт, поэтому\nмы никого не беспокоим.)

\n\n

Получите данные с помощью:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"RU","title":"Благородные родственники","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"Так намного лучше.","error":"","text":"

Итак, теперь у нас есть список пьес из Интернета. Список был в формате json.\nК счастью для нас Ruby любезно предоставляет метод преобразования данных json в hash Ruby.\nМетод get_shakey сделает это за нас.

\n\n

Но так как структура json-данных сохраняется в hash, ее все-таки трудно читать.\nДавайте напишем метод для показа игр.

\n\n

Если вы внимательно изучите список пьес, вы увидите, что у него есть своего рода вложенный\nсостав. (Это действительно довольно распространено в данных, которые вы получаете из Интернета.)\nВыглядит так:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Чтобы перечислить пьесы, нам сначала нужно получить доступ к верхнему элементу словаря «Уильям Шекспир» по его названию.\nЗатем мы должны iterate(“шагать”) по каждому элементу за ним.

\n\n

Ruby имеет метод для итерации. Он называется each. Мы видели это раньше, когда\nсоздавали нашу систему рейтинга книг.

\n\n

Все, что возвращает метод each, передается блоку:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"RU","title":"Все вместе","chapter":"N","answer":"^4$","ok":"Ага, Шекспир написал 4 пьесы в 1591","error":"Ответ должен быть 4. Проверьте аргумент метода count_plays","text":"

Теперь предположим, что мы хотим знать имена и количество пьес, написанных Шекспиром\nв течение определенного года.

\n\n

Ruby позволяет нам выводить значения из словаря. Метод select использует блок, который позволяет нам\nопределить, что выбрать и вернуть найденное.

\n\n

Затем мы можем использовать результаты, возвращаемые select в методе each, как и раньше,\nпросто добавляя его после блока выбора. Это еще один пример цепочки методов, который мы видели\nраньше, когда делали стихотворение задом наперед.

\n\n

Я подготовил метод count_plays для вас. Посмотрим, сможете ли\nвы посчитать количество пьес, написанных Шекспиром в 1591:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

Вы заметили, что я добавил метод count в самом конце всего метода. Так мы получим \nвозвращаемое значение метода count_plays.

\n\n

Есть и другой способ выстраивания цепочки. Видите одинокую строчку s = get_shakey.\nВы можете добавить [“William Shakespeare”].select { |k, v| в конец get_shakey\n(не обязательно здесь).

\n","load_code":"prev"}, "41":{"lang":"RU","title":"Все хорошо, что хорошо кончается","chapter":"N","answer":"All's Well That Ends Well","ok":"Верно","error":"Используйте 1605 как 2 параметр","text":"

Хорошо, мы получили некоторые данные из Интернета, мы выбрали то, что хотели, и распечатали это.\nЧто нужно улучшить? Мы могли бы напечатать результаты немного красивее. Как добавить год\nи выровнять названия и годы?

\n\n

Это значит требуется печать нескольких значений на одной строке. Ruby имеет удобный способ сделать\nэто. Это похоже на печать строки типа: _puts «Привет, меня зовут Джимми» _.\nНо вместо буквенного значения Джимми мы используем значение переменной.

\n\n

Сначала замените Джимми на #{}. Если Ruby видит символ #, а за ним символ {,\nто это означает,что до символа } идет имя переменной. \nТак, мы можем использовать: “Привет, меня зовут #{name}”.

\n\n

Изменим наш код немного:

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

Я добавил .ljust(30) к заголовку. В таком случае заголовок имеет отступ минимум\n30 символов. Так год выглядит опрятнее =)

\n\n

Посмотрите, изменится ли выход программы так, чтобы она показывала такие игры: 1600 -> Как вам нравится\nВсе хорошо, что хорошо кончается? \nЭй, мы еще не закончили, но конец близок!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"RU","title":"Приложения делаются","chapter":"N","answer":"","ok":"","error":"","text":"

Мы открыли новый BlurbTM класс. Чем наполнен ваш блог?\nВерно, контентом. Также временем, когда BlurbTM был опубликован. И настроением.

\n\n

Хорошо, так что у вас есть первая строка класса, вот и все:

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

Имена классов всегда с большой буквы.

\n","load_code":""}, "48":{"lang":"RU","title":"Аксессоры это обособленные элементы","chapter":"N","answer":"Blurb:","ok":"Мой первый Blurb","error":"","text":"

Привет. У тебя есть новый BlurbTM класс.

\n\n

В определении класса вы использовали метод, называющийся attr_accessor(аксессор).\nВообще много атрибутов класса, которые так или иначе его меняют.\nАтрибуты - это всего лишь переменные связанные с классом.

\n\n

Думайте так. Класс - это человек. Это звездное человеческое существо.\nА атрибуты - это его конечности, разные части собираются в тело, а другие люди могут взять этого человека за руку и поздороваться.

\n\n

Сейчас

\n\n

Чтобы создать BlurbTM и наполнить данными напишите:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"RU","title":"Объект, этот аккуратный маленький пакет","chapter":"N","answer":"Blurb:","ok":"Blurb обновлен","error":"","text":"

А теперь поменяй атрибуты нашего BlurbTM:

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"RU","title":"Ускоряемся","chapter":"N","answer":"^\\d{4}","ok":"Запомнили :)","error":"","text":"

Круто, новое приложение потрясающее. Хей, давай немного упростим?\nВы всегда хотите ставить время вашему BlurbTM так?.

\n\n

Вы всего лишь хотите писать контент?

\n\n

Добавим метод инициализации в наш класс. Этот метод будет всегда вызываться, когда новый BlurbTM\nсоздается.\nТакже мы можем установить максимальную длину BlurbTM контента в 40 символов.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(Этот параметр content=“” используется, чтобы было известно, что это строка и никакой другой параметр не мог инициализировать его.)

\n","load_code":""}, +"50":{"lang":"RU","title":"Ускоряемся","chapter":"N","answer":"^\\d{4}","ok":"Запомнили :)","error":"","text":"

Круто, новое приложение потрясающее. Хей, давай немного упростим?\nВы всегда хотите ставить время вашему BlurbTM так?.

\n\n

Вы всего лишь хотите писать контент?

\n\n

Добавим метод инициализации в наш класс. Этот метод будет всегда вызываться, когда новый BlurbTM\nсоздается.\nТакже мы можем установить максимальную длину BlurbTM контента в 40 символов.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(Этот параметр content=“” используется, чтобы было известно, что это строка и никакой другой параметр не мог инициализировать его.)

\n","load_code":""}, "51":{"lang":"RU","title":"Вы научили ваше приложение отвергать бесполезные вещи","chapter":"N","answer":"Blurb:","ok":"Blurb добавлен","error":"","text":"

Вы заметили, что мы используем символ “собаки” внутри класса? (@time).

\n\n

Снаружи класса мы используем аксессоры:

\n\n
\n

blurb.time = Time.now

\n
\n\n

но внутри мы используем переменные объекта:

\n\n
\n

@time = Time.now

\n
\n\n

Это одно и тоже, но может использоваться в разных местах вашей программы.

\n\n

Создадим другой BlurbTM

\n\n

Когда другой BlurbTM создан, метод инициализации используется для проверки любого\nаргумента к методу new.

\n\n

Ох, нужно еще 2 аргумента:

\n\n
blurb2 = Blurb.new :confused, "Не могу поверить, Маунт-Худ был украден!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"RU","title":"А жирафы на месте ИТОГИ #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Ага, ты здесь. И все еще учишься. Мы по-прежнему будем делать ваше приложение реальным,\nно пока давайте посмотрим результаты, хорошо?

\n\n

Классы

\n\n

Все в Ruby - это объекты. Классы объясняют объекты как независимые рабочие элементы.\nНапример, вы создали несколько BlurbTM объектов, а эти объекты ведут себя так же
\nкак любой объект класса Blurb.

\n\n

Другими словами: Вы называете их Blurb объекты.\nВы можете использовать классы как в реальной жизни.

\n\n

Аксессоры

\n\n

Аксессоры - это переменные, связанные с классом, но используются снаружи объекта.\n(blurb2.time = Time.now)

\n\n

Переменные объекта

\n\n

Это то же самое, что и аксессоры, но используются внутри объекта.\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"Не могу поверить, Маунт-Худ был украден!\""}, "53":{"lang":"RU","title":"Ваш собственный сад","chapter":"N","answer":"Blurbalizer:","ok":"Приложение создано","error":"","text":"

Ладно, давай обернемся, малыш. Вот последняя глава эпической истории познания «Try Ruby»!\nТеперь, когда у вас есть понимание, как все это работает, как вы собираетесь использовать это?\nТы отличный человек (один из моих любимых), но тебе нужно руководство.

\n\n

Давай закончим наше приложение

\n\n

У вас есть записи приложений, но нет приложения.\nПо-прежнему нужно место, где хранить все BlurbsTM и упорядочить их.

\n\n

Угадайте что, мы собираемся использовать другой класс. Я дал весь код для нового класса за один раз.\nТолько потрать время, чтобы изучить его.\nЯ не тороплюсь, я буду ждать тебя на следующем уроке.

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # Пустой массив\n                 # для хранения Blurbs\n  end\n\n  def add_a_blurb(mood, content)\n    # << означают добавить в конец массива\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/source/try_ruby_ua.json b/source/try_ruby_ua.json index dad25670..42aa7ca1 100644 --- a/source/try_ruby_ua.json +++ b/source/try_ruby_ua.json @@ -17,15 +17,15 @@ "17":{"lang":"UA","title":"Елементи","chapter":"N","answer":"^(12|35|47)$","ok":"Ok","error":"Майже","text":"

Ми зберегли числа в змінну, а як їх отримати назад?

\n\n

Ми вже бачили, як ми можемо отримати максимальний елемент, використовуючи метод max.\nТакож ти можеш отримати first (перший) або last (останній) елемент списку.\nА що коли ти хочеш отримати якийсь конкретний елемент?

\n\n

[ ]

\n\n

Ruby використовує [], щоб націлитися на елемент.\nКвадратні дужки дуже поширені в Ruby.\nВони означають: “Я шукаю ____”, Готовий, цілься!

\n\n

Отримай всі номери зі списку:

\n\n
puts ticket [0]\nputs ticket [1]\nputs ticket [2]\n
\n\n

Чому ми використовуємо [0], [1], [2]?

\n\n

А не [1], [2] чи [3]? Це якийсь японський дзен? Ні, в багатьох мовах програмування відлік йде з нуля. Це не тільки особливість Ruby.

\n\n
\n

Невелике нагадування: ти можеш використовувати кнопку Copy.

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"UA","title":"Підсумки #2 Що тут у нас?","chapter":"Y","answer":"(.+)","ok":"Чи є хоч якась рима?)","error":"","text":"

Зараз поглянемо, як минула твоя друга хвилина:

\n\n

Помилки

\n\n

Якщо ти спробуєш розгорнути число чи якусь іншу дурницю, Ruby скаже тобі про це.

\n\n

Масиви

\n\n

Масиви – це списки, що зберігають елементи в певній послідовності.\nМи вже знаємо, як створити масив і отримати елементи з нього.

\n\n

Змінні

\n\n

Змінні зберігають значення і дають їм імена. Ми використали знак рівності щоб зробити це.\nЯк тут: ticket = [14, 37, 18].

\n\n

2/8

\n\n

Всього тут 8 розділів. 2 вже позаду! Не дуже й складно, так?

\n\n

Змінімо напрямок. Я люблю поезію і поклав трохи в змінну poem, тож поглянь. Набери:

\n\n
puts poem\n
\n","load_code":"poem = \"Моя канапка випала у мене з рук. \\nІ моя канапка полетіла на Місяць. \\nТа коли я побачив її в телевізорі, \\nРазом з прапором України на кометі Галлея, \\nТоді я найбільше хотів її з'їсти\\n\""}, "19":{"lang":"UA","title":"На жаль, тобі не подобається така поезія","chapter":"N","answer":"(toast){0}","ok":"Чудово","error":"Все одно канапка","text":"

Все гаразд. Всі ми різні. Редагуй цей шматочок як хочеш. Замість канапки може бути грушка або що завгодно.\nСпробуй це, щоб побачити новий варіант поеми:

\n\n

poem.gsub(“канапка”, “грушка”)

\n\n

Метод gsub це скорочення global substitute (замінник). Він замінить всі збіги “канапка” на “грушка”.

\n","load_code":"prev"}, -"20":{"lang":"UA","title":"Готовий, цілься!","chapter":"N","answer":"^\\nитсї'з її вітох (.+)","ok":"Звісно, увесь віршик розвернутий задом наперед","error":"","text":"

Питання для тебе: що станеться?

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"UA","title":"Готовий, цілься!","chapter":"N","answer":"кур з енем у алапив акпанак яоМ","ok":"Звісно, увесь віршик розвернутий задом наперед","error":"","text":"

Питання для тебе: що станеться?

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"UA","title":"Занадто багато слів навпаки","chapter":"N","answer":"^\\[\"Тоді я найбільше (.+)","ok":"Так, майже те що треба","error":"","text":"

Що ж, вся наша поема стала задом наперед, слово за словом! Але ж я всього лише хотів зробити це для рядків.\nПеремісти перший рядок на кінець, а останній на початок. Тобто навпаки, але не так.

\n\n

Ось як:

\n\n
poem.lines.reverse\n
\n","load_code":"prev"}, -"22":{"lang":"UA","title":"Ще трохи методів в ланцюжок","chapter":"N","answer":"^Тоді я найбільше (.+)","ok":"Прекрасно, друже!
Метод join взяв масив рядків і з'єднав їх в один рядок'.","error":"","text":"

Що ти бачиш тут? Що сталося? Ти набрав poem.lines.reverse і що сталося?

\n\n

Дві речі. Перше: ти розбив віршик на рядки, за допомогою методу lines, і отримав масив з них.

\n\n

Потім ти розгорнув цей список задом наперед і розгорнув кожен рядок. От і все!

\n\n

Додамо ще один метод в кінець:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбінування методів таким чином називається ланцюжком методів.

\n","load_code":"prev"}, +"22":{"lang":"UA","title":"Ще трохи методів в ланцюжок","chapter":"N","answer":"Моя канапка випала у мене з рук","ok":"Прекрасно, друже!
Метод join взяв масив рядків і з'єднав їх в один рядок'.","error":"","text":"

Що ти бачиш тут? Що сталося? Ти набрав poem.lines.reverse і що сталося?

\n\n

Дві речі. Перше: ти розбив віршик на рядки, за допомогою методу lines, і отримав масив з них.

\n\n

Потім ти розгорнув цей список задом наперед і розгорнув кожен рядок. От і все!

\n\n

Додамо ще один метод в кінець:

\n\n
puts poem.lines.reverse.join\n
\n\n

Комбінування методів таким чином називається ланцюжком методів.

\n","load_code":"prev"}, "23":{"lang":"UA","title":"Підсумки #3 Тут і зараз","chapter":"Y","answer":"\\{\\}","ok":"Ти створив порожній словник!","error":"","text":"

Знак оклику

\n\n

Методи можуть мати знак оклику (як і знак питання) в своєму імені.\nВони тут для більш зрозумілого пояснення, що вони роблять. Нічого страшного.

\n\n

Маніпуляції з рядками

\n\n

Пошук і зміна рядків

\n\n

Ланцюжки

\n\n

Ланцюжки методів дозволяють зробити набагато більше. Розбити віршик, розгорнути його, об'єднати в рядок:\npoem.lines.reverse.join

\n\n

На цьому етапі, ти можеш подивитися всі методи для рядків тут here.

\n\n

Спробуй декілька з них: poem.downcase або poem.swapcase

\n\n

Готовий?

\n\n

Коли ви будеш готовий рухатися далі, набери:

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"UA","title":"Порожній словник","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Yes that's a new review","error":"Use one of splendid, quite_good, mediocre, quite_not_good, abysmal.
Don't forget the colon","text":"

Ми створили порожній словник (hash). Словник – це як масив, тільки у кожного елемента є ім'я.

\n\n
\n

Примітка перекладача: в україномовному співтоваристві слово hash перекладається як словник. Якщо Array перекладають як масив, то Hash – словник, інколи просто >хеш. Назва hash походить від hash-функції, на основі якої працює словник, і яка дозволяє дуже швидко знаходити елемент за ключем (ім'ям). Але щоб використовувати словники, нам це знати не обов'язково.

\n
\n\n

Ми збираємося записати кілька мініатюрних відгуків в наш новий словник. Ось наша рейтингова система:

\n\n
    \n
  • :splendid → витвір мистецтва
  • \n
  • :quite_good → так, сподобалося
  • \n
  • :mediocre → посередньо
  • \n
  • :quite_not_good → загалом погано
  • \n
  • :abysmal → жах
  • \n
\n\n

Щоб оцінити книгу, додай назву в квадратних дужках і постав оцінку після знака дорівнює. Наприклад:

\n\n
books["Фарбований Лис"] = :splendid\n
\n\n
\n

Зараз, я вважаю за необхідне сказати, що всі уроки в TryRuby відокремлені один від одного.\nТож якщо ти вирішив пофестивалити і зробити дуже багато відгуків, то використовувати їх ти зможеш тільки в цьому уроці.\nЯкщо ж хочеш використати свої відгуки і в наступному уроці, то ти повинен скопіювати їх і вставити.\nНе турбуйся про це, в кожному уроці є багато запрограмованих речей для тебе щоб гратися.

\n
\n","load_code":"books = {}"}, "25":{"lang":"UA","title":"Ще кілька простих відгуків","chapter":"N","answer":"[3-9]","ok":"Бачиш, метод length працює з рядками, списками і словниками.","error":"","text":"

Продовжуй, заповни хеш відгуками. А якщо хочеш побачити весь список, просто набери: puts books

\n\n

Знову ж, можливі оцінки: :splendid, :quitegood, :mediocre, :quitenot_good і :abysmal.

\n\n

Ці оцінки не є рядками. Коли ти ставиш двокрапку перед простим словом, ти отримуєш символ (Symbol). Символ є дешевшим за рядок (з точки зору комп'ютерної пам'яті). Тож якщо використовуєш слово знову і знову в своїй програмі, використовуй символ. Замість того, щоб мати тисячі копій цього слова в пам'яті, Ruby буде зберігати символ тільки один раз.

\n\n

Що важливіше, символ каже нам, що це не просто якесь слово, а таке, що має значення у нашій програмі.

\n\n
\n

Примітка перекладача: в англійській мові є два слова: Symbol і Char, і обидва перекладаються українською як “символ”.\nВ контексті Ruby Symbol правильно було б перекласти як “ідентифікатор”, але використовують слово символ.\nТому якщо в контексті Ruby ти почуєш “символ”, то швидше за все це Symbol, ідентифікатор, який записується як :good, і є оптимізованим для пам'яті рядком.

\n
\n\n

Введи ще 2 відгуки, використовуй books.length, щоб дізнатися, скільки відгуків в словнику:

\n\n
books["Сутінки. Сага."] = :abysmal\nbooks["Фарбований Лис"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Фарбований лис\" => :splendid}"}, "26":{"lang":"UA","title":"Стоп, невже я засудив Фарбованого Лиса?)","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"Мені сподобалося","error":"","text":"

Однією з чудесних особливостей Ruby є те, що імена часто використовуються повторно, тож менша кількість імен, які тобі треба запам'ятати.

\n\n

Раніше ми витягли елементи з масиву за допомогою числа:\nputs ticket[1].

\n\n

Для словника це працює однаково, але ми використовуємо не число, щоб отримати елемент, а ім'я (ключ).

\n\n

Отже, якщо хочеш подивитися один зі своїх старих відгуків, знову введи назву в квадратних дужках. Але не пиши знак дорівнює. Ось так:

\n\n
puts books["Фарбований Лис"]\n
\n","load_code":"books = {\"Фарбований Лис\" => :splendid, \"Сутінки. Сага.\" => :abysmal, \"Хоббіт\" => :mediocre}"}, "27":{"lang":"UA","title":"Словники це пари","chapter":"N","answer":"^\\[\".*\"\\]","ok":"Ти знайшов ключі","error":"","text":"

Пам'ятай, що словники не зберігають елементи в послідовності. Це не їхнє завдання.\nВони створюють пару з двох елементів: ключ (key) і значення (value)

\n\n

У твоїх відгуках, назва книги це ключ, а оцінка – значення.

\n\n

Якщо ж хочеш побачити всі назви книг які ти оцінив, введи:

\n\n
books.keys\n
\n\n

Також спробуй використати .values замість .keys.

\n","load_code":"prev"}, -"28":{"lang":"UA","title":"Ти суворий критик?","chapter":"N","answer":"\"mediocre\"","ok":"Ти створив свій власний рейтинг книжок","error":"","text":"

Ти пишеш суворі, несправедливі відгуки? Порахуємо їх в новому словнику ratings:

\n\n

Тепер ми можемо їх порахувати. Набери:Then, okay, now let’s count up your reviews. Just stay with me. Type:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Прямою лінією в коді є символ pipe, ймовірно, розташований зверху клавіші Enter на твоїй клавіатурі.

\n\n

Цей рядок += 1 означає: збільшити значення на одиницю.

\n\n

Не турбуйся, якщо не розумієш всього, що тут відбувається. Все буде ясно пізніше.

\n","load_code":"books = {\"Фарбований Лис\" => :splendid, \"Сутінки. Сага.\" => :abysmal, \"Хоббіт\" => :mediocre, \"Голодні ігри\" => :mediocre}"}, +"28":{"lang":"UA","title":"Ти суворий критик?","chapter":"N","answer":":mediocre","ok":"Ти створив свій власний рейтинг книжок","error":"","text":"

Ти пишеш суворі, несправедливі відгуки? Порахуємо їх в новому словнику ratings:

\n\n

Тепер ми можемо їх порахувати. Набери:Then, okay, now let’s count up your reviews. Just stay with me. Type:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

Прямою лінією в коді є символ pipe, ймовірно, розташований зверху клавіші Enter на твоїй клавіатурі.

\n\n

Цей рядок += 1 означає: збільшити значення на одиницю.

\n\n

Не турбуйся, якщо не розумієш всього, що тут відбувається. Все буде ясно пізніше.

\n","load_code":"books = {\"Фарбований Лис\" => :splendid, \"Сутінки. Сага.\" => :abysmal, \"Хоббіт\" => :mediocre, \"Голодні ігри\" => :mediocre}"}, "29":{"lang":"UA","title":"Підрахунок","chapter":"N","answer":".+","ok":"Будьмо!","error":"","text":"

Одна з приголомшливих речей, яку ми щойно використали це блок (block).\nМи вивчимо їх докладніше на цьому й наступному уроці. Та загалом блок – це трохи коду на Ruby, оточеного фігурними дужками.

\n\n

Спробуй створити інший блок:

\n\n
5.times{ print "Будьмо!" }\n
\n\n

Блоки завжди прив'язані до методів. Як метод times, який бере блок і запускає код знову і знову. (В нашому прикладі: п'ять разів.)

\n","load_code":""}, "30":{"lang":"UA","title":"Є хвилинка?","chapter":"N","answer":"[0-9]$","ok":"Дуже вчасно!","error":"Виконай від 0 до 9","text":"

Як ми бачили в першому прикладі з блоком (при підрахунку оцінок), ми можемо передати змінну блокові.\nЗначення, яке вставляється визначається методом, який запускає блок.

\n\n

Змінні, які приймає блок, поміщаються в ім'я змінної на початку блоку, між двома символами pipe: |

\n\n

Спробуймо це за допомогою цього блоку:

\n\n
5.times {|time|\n    puts time\n}\n
\n\n

Тут метод .times посилає значення змінній |time|. Але майте на увазі, що ця змінна відома тільки всередині блоку.

\n\n
\n

Ти помітив, що можеш розділити код на декілька рядків? Так їх потім простіше читати.

\n
\n","load_code":""}, "31":{"lang":"UA","title":"Підводячи підсумки #4","chapter":"Y","answer":"","ok":"","error":"","text":"

Цей урок був дещо довшим і ти, ймовірно, витратив на три хвилини більше на його вивчення:

\n\n

Словники

\n\n

Найпростіший приклад словника: {}

\n\n

Символи

\n\n

Крихітні але ефективні кодові слова з двокрапкою, наприклад: :splendid

\n\n

Блоки

\n\n

Шматочки коду, які можна прив'язати до багатьох методів Ruby.\nОсь код, який ми використовували щоб створити таблицю оцінок:
\nbooks.values.each { |rate| ratings[rate] += 1 }

\n\n

Далі

\n\n

На наступних уроках ми ще глибше зануримося в методи.

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"UA","title":"Достиглий плід твоєї праці","chapter":"N","answer":"^Приборкав норовливу","ok":"Так їм!","error":"","text":"

Новий метод народжено. Спробуємо його використати:

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"Приборкав норовливу\"};end;"}, "36":{"lang":"UA","title":"Давай і бери","chapter":"N","answer":"\\d+","ok":"Так","error":"","text":"

Більшість методів не тільки вимагають введення деяких параметрів, але й повернуть щось назад.\nЯ трохи змінив наш метод, щоб він повернув нам значення. Спробуй:

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

Результат

\n\n

А оскільки ти вже настільки просунутий і компетентний, ще одна порада: можеш опустити слово return з останнього рядка методу.\nRuby автоматично поверне останнє значення, яке використовувалося в методі.

\n\n

Так ми можемо змінити останній рядок просто на: number_of_shrews.

\n\n

Але оскільки метод .times також повертає number_of_shrews ми можемо стерти останній рядок цілком.\nТак що наш новий метод робить те, що ми від нього хотіли!

\n","load_code":""}, "37":{"lang":"UA","title":"Привіт, хто тут? Підсумки #5 вітають тебе!","chapter":"Y","answer":"","ok":"","error":"","text":"

Відмінно, відмінно, відмінно!\nСупер, супер, сууууупер!

\n\n

Ось що ми ще дізналися:

\n\n

Методи

\n\n

Методи можуть бути визначені за допомогою def та мають ім'я.\nМетоди роблять нашу програму коротшою і простішою для читання.

\n\n

Параметри

\n\n

Методи можуть мати параметри.

\n\n

Значення, що повертаються

\n\n

Методи (майже) завжди повертають якесь значення.

\n\n

А зараз

\n\n

Бути чи не (бути) не є для тебе більше великим питанням. Ти готовий почитати ще трохи Шекспіра?

\n","load_code":""}, -"38":{"lang":"UA","title":"Світ – наша мушля","chapter":"N","answer":"^\\{\\\"William","ok":"Добре. Але важко читати.","error":"","text":"

Досі ти запускав програми, які використовують тільки те, що ти набирав сам. Це класно, але зараз епоха інтернету, а значить можна використовувати ці дані.

\n\n

Багато, багато веб-сайтів в мережі, а значить у всіх них можна запросити інформацію. Наприклад: ця посилання дасть вам всі останні Новини з Гугла по тематиці Ruby.

\n\n

Ваш бравзер, можливо, відобразить це красиво. Але якщо поглянеш на сирцевий код (натисни: ctrl-U), то побачиш складний текст в форматі rss.

\n\n

Формати

\n\n

Всього існує дуже багато форматів зі складними назвами в мережі, такі як: html, xml та json. Ага, навіть цей веб-сайт використовує декілька.

\n\n

Я підготував для тебе метод, який вибере список повних робіт Вільяма Шекспіра ​​з Інтернету. (Не хвилюйся, насправді все це скачується з того ж сервера, на якому розміщений мій сайт, тому ми нікого не турбуємо.)

\n\n

Отримай дані за допомогою:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"UA","title":"Світ – наша мушля","chapter":"N","answer":"^\\{\\\"William","ok":"Добре. Але важко читати.","error":"","text":"

Досі ти запускав програми, які використовують тільки те, що ти набирав сам. Це класно, але зараз епоха інтернету, а значить можна використовувати ці дані.

\n\n

Багато, багато веб-сайтів в мережі, а значить у всіх них можна запросити інформацію. Наприклад: ця посилання дасть вам всі останні Новини з Гугла по тематиці Ruby.

\n\n

Ваш бравзер, можливо, відобразить це красиво. Але якщо поглянеш на сирцевий код (натисни: ctrl-U), то побачиш складний текст в форматі rss.

\n\n

Формати

\n\n

Всього існує дуже багато форматів зі складними назвами в мережі, такі як: html, xml та json. Ага, навіть цей веб-сайт використовує декілька.

\n\n

Я підготував для тебе метод, який вибере список повних робіт Вільяма Шекспіра ​​з Інтернету. (Не хвилюйся, насправді все це скачується з того ж сервера, на якому розміщений мій сайт, тому ми нікого не турбуємо.)

\n\n

Отримай дані за допомогою:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"UA","title":"Шляхетні родичі","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"Так значно краще","error":"","text":"

Отже, тепер у нас є список п'єс з Інтернету. Список був в форматі json. На щастя для нас Ruby люб'язно надає метод перетворення даних json на словник Ruby. Метод get_shakey зробив це за нас.

\n\n

Але оскільки структура json-даних зберігається в словнику, її трохи важко читати. Тож ми напишемо метод для показу п'єс.

\n\n

Якщо ти уважно вивчиш список п'єс, то побачиш, що він має наче гніздову структуру.\n(Це досить поширено в даних, які ти отримуєш з Інтернету.) Виглядає це так:

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

Щоб перерахувати п'єси, нам спочатку потрібно отримати доступ до верхнього елементу словника “Вільям Шекспір” по його назві.\nПотім ми повинні iterate (“крокувати”) по кожному елементу за ним.

\n\n

Ruby має метод для ітерації. Він називається each. Ми бачили це раніше, коли створювали нашу систему рейтингу книжок.

\n\n

Все, що повертає метод each, передається блокові:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"UA","title":"Всі разом","chapter":"N","answer":"^4$","ok":"Так, Шекспір написав 4 п'єси' в 1591","error":"Відповідь для року 1591 має бути 4","text":"

Тепер припустімо, що ми хочемо знати імена і кількість п'єс, написаних Шекспіром протягом певного року.

\n\n

Ruby дозволяє нам виводити значення зі словника.\nМетод select використовує блок, який дозволяє нам визначити, що вибрати і повернути знайдене.

\n\n

Потім ми можемо використовувати результати, які повертаються через select в методі each, як і раніше, просто додаючи його після блоку select. Це ще один приклад ланцюжка методів, який ми бачили раніше, коли розгортали віршик задом наперед.

\n\n

Я підготував для тебе метод count_plays. Побачимо, чи зможеш ти порахувати кількість п'єс, написаних Шекспіром в 1591:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

Ти помітив, що я додав метод count в самому кінці кожного методу. Так ми отримаємо значення, що повертається методу count_plays.

\n\n

Є й інший спосіб вибудовування ланцюжка. Бачиш самотній рядок s = get_shakey.\nТи можеш додати [“William Shakespeare”].select{ |k, v| в кінець get_shakey (але не обов'язково тут).

\n","load_code":"prev"}, "41":{"lang":"UA","title":"Все добре, що добре закінчується","chapter":"N","answer":"All's Well That Ends Well","ok":"True","error":"Використовуй 1605 як другий параметр","text":"

Добре, ми отримали деякі дані з Інтернету, ми вибрали те, що хотіли, і роздрукували це.\nЩо ще поліпшити? Ми могли б надрукувати результати трохи гарніше. Як додати рік і вирівняти назви і роки.

\n\n

Це означає потрібно друк декількох значень на одному рядку. Ruby має зручний спосіб зробити це.\nЦе схоже на друк рядка типу: puts “Привіт, мене звуть Андрій”. Але замість літерного значення Андрій ми використовуємо значення змінної.

\n\n

Спочатку заміни Андрій на #{}. Якщо Ruby бачить символ #, а за ним символ {то шукає змінні між цими дужками}.\nТож ми можемо використати: “Привіт, мене звуть #{name}”.

\n\n

Змінимо наш код трохи:

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

Я додав .ljust(30) до заголовку. В такому випадку заголовок має відступ мінімум 30 символів. Так рік виглядає охайніше :)

\n\n

Подивися, чи зміниться вихід програми так, щоб вона показувала такі п'єси: 1600 -> As You Like It

\n\n

Все добре, що добре занчується? Гей, ми ще не закінчили, але кінець вже близько!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"UA","title":"Те з чого робляться додатки","chapter":"N","answer":"","ok":"","error":"","text":"

Ми відкрили новий BlurbTM class. клас. Чим наповнений ваш блог?\nТак, змістом! Також часом, коли BlurbTM був опублікований. І настроєм.

\n\n

Добре, тож у нас є перший рядок класу, ось решта:

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

Імена класів завжди починаються з великої літери (і знову ж, нічого не повертається).

\n","load_code":""}, "48":{"lang":"UA","title":"Аксесори це кінцівки","chapter":"N","answer":"Blurb:","ok":"Мій перший Blurb","error":"","text":"

Чудово. У тебе є новий BlurbTM клас.

\n\n

У визначенні класу ти використав метод, який називається attr_accessor (аксесор).\nВзагалі є багато атрибутів класу, які так чи інакше його змінюють. Атрибути – це всього лише змінні пов'язані з класом.

\n\n

Думайте так. Клас – це людина. Це людська істота у формі зірки.\nА атрибути – це її кінцівки, різні частини збираються в тіло, а інші люди можуть взяти цю людину за руку і привітатися.

\n\n

Зараз

\n\n

Щоб створити BlurbTM і наповнити даними напиши:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"UA","title":"Об'єкт, цей акуратний маленький пакет","chapter":"N","answer":"Blurb:","ok":"Blurb оновлено","error":"","text":"

А тепер змінимо атрибути нашого BlurbTM:

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"UA","title":"Прискорюємося","chapter":"N","answer":"^\\d{4}","ok":"Відмічено","error":"","text":"

Круто, новий додаток просто блискучий. А як щодо спростити?\nТи не захочеш ставити час свого BlurbTM кожного разу коли постиш, чи не так?

\n\n

Ти просто хочеш записати свої контент і настрій?

\n\n

Додамо метод ініціалізації initialize в наш клас.\nЦей метод буде завжди викликатися, коли ти створюєш новий BlurbTM.\nТакож ми можемо встановити максимальну довжину BlurbTM контенту в 40 символів.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(Цей параметр content=“” використовується, щоб нам було відомо, що контент це рядок і ніякий інший параметр не може ініціювати його.)

\n","load_code":""}, +"50":{"lang":"UA","title":"Прискорюємося","chapter":"N","answer":"^\\d{4}","ok":"Відмічено","error":"","text":"

Круто, новий додаток просто блискучий. А як щодо спростити?\nТи не захочеш ставити час свого BlurbTM кожного разу коли постиш, чи не так?

\n\n

Ти просто хочеш записати свої контент і настрій?

\n\n

Додамо метод ініціалізації initialize в наш клас.\nЦей метод буде завжди викликатися, коли ти створюєш новий BlurbTM.\nТакож ми можемо встановити максимальну довжину BlurbTM контенту в 40 символів.

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(Цей параметр content=“” використовується, щоб нам було відомо, що контент це рядок і ніякий інший параметр не може ініціювати його.)

\n","load_code":""}, "51":{"lang":"UA","title":"Ти навчив свій додаток відкидати непотрібні речі","chapter":"N","answer":"Blurb:","ok":"Blurb додано","error":"","text":"

Ти помітив, як ми використовуємо символ собачки “всередині класу”? (@time).

\n\n

Ззовні класу ми використовуємо аксесор:

\n\n
\n

blurb.time = Time.now

\n
\n\n

але всередині ми використовуємо змінні об'єкта:

\n\n
\n

@time = Time.now

\n
\n\n

Це одне і те саме, але може використовуватися в різних місцях твоєї програми.

\n\n

Створімо інший BlurbTM

\n\n

Коли інший BlurbTM створений, метод ініціалізації використовується для перевірки будь-якого аргументи до методу new.

\n\n

Ой, потрібно ще 2 аргументи:

\n\n
Blurb2 = Blurb.new :confused, "Не можу повірити, Мавнт-Худ вкрали!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"UA","title":"А жирафа на місці Підсумки #7","chapter":"Y","answer":"","ok":"","error":"","text":"

Ага, ти тут. І все ще вчишся.\nМи як і раніше будемо робити твій додаток реальним, але поки що погляньмо на результати, гаразд?

\n\n

Класи

\n\n

Все в Ruby – це об'єкти. Класи пояснюють об'єкти, як певний об'єкт працює.\nНаприклад, ти створив кілька BlurbTM об'єктів, а ці об'єкти поводяться так само як будь-який об'єкт класу Blurb.\nІншими словами: ти називаєш їх Blurb об'єктами. Ти можеш використовувати класи щоб (начебто) моделювати реальне життя.

\n\n

Аксесори

\n\n

Аксесори – це змінні, пов'язані з класом, але використовуються ззовні об'єкта.

\n\n

(blurb2.time = Time.now)

\n\n

Змінні об'єкта

\n\n

Це те ж саме, що й аксесори, але вони використовуються всередині об'єкта.\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"UA","title":"Твій власний терен","chapter":"N","answer":"Blurbalizer:","ok":"Додаток створено","error":"","text":"

Гаразд, закругляймося, хлопче. Ось останній розділ епічної історії пізнання Try Ruby!\nТепер, коли у тебе є розуміння, як все це працює, як ти збираєшся його використовувати?\nТи чудова людина (один з моїх улюбленців), але тобі потрібне керівництво.

\n\n

Закінчимо наш додаток

\n\n

У нас є записи додатків, але може бути відсутня програма.\nЯк і раніше потрібно ім'я, місце, де можна зберігати всі BlurbsTM і впорядкувати їх.

\n\n

Ми збираємося використовувати інший клас. Я дав весь код для нового класу за раз. Тільки не поспішай, вивчи його.\nЯ не поспішаю, я буду чекати тебе на наступному уроці.

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # Порожній масив\n                 # для зберігання Blurbs\n  end\n\n  def add_a_blurb(mood, content)\n    # The << means add to the end of the array\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/source/try_ruby_zh.json b/source/try_ruby_zh.json index 675369a1..220c1113 100644 --- a/source/try_ruby_zh.json +++ b/source/try_ruby_zh.json @@ -17,15 +17,15 @@ "17":{"lang":"ZH","title":"元素","chapter":"N","answer":"^(12|35|47)$","ok":"完成","error":"差一点","text":"

我们已经把在变量ticket里的彩票数字排序了,那怎么再把它们拿出来呢?

\n\n

我们已经知道了可以用 max 来得到最大的值。\n同样的,你可以\n用 first 或者 last 来得到第一个或是第二个元素。\n可如果你想要一个特定的值呢?

\n\n

[ ]

\n\n

Ruby使用方括号[ ]来选择元素\n方括号在Ruby中非常常见\n它们就像用来瞄准目标的瞄准器\n意味着“我要去寻找”,准备,瞄准。

\n\n

让我们输出我们全部的彩票数字

\n\n
puts ticket[0]\nputs ticket[1]\nputs ticket[2]\n
\n\n

我们为什么使用 [0], [1], [2]?

\n\n

而不是 [1], [2] 和 [3]? 难道这是来自日本的神秘佛教计数法吗?不, 我们computer people就是喜欢从0开始数。不仅仅是Ruby,大多数编程语言都从0开始数。

\n\n
\n

一个小提示: 你可以按 Copy 按钮,把示例代码复制到编辑器中。

\n
\n","load_code":"ticket = [12, 47, 35]"}, "18":{"lang":"ZH","title":"总结#2 来了","chapter":"Y","answer":"\\w+","ok":"押韵吗?","error":"","text":"

现在,回顾一下你的第二分钟学了什么:

\n\n

Errors(错误)

\n\n

如果你尝试逆置一个数字,Ruby就会告诉你这个。

\n\n

数组

\n\n

数组是以某种顺序来储存元素的列表。\n我们也学了如何创造数组,与如何从中获取元素。

\n\n

变量

\n\n

变量保存事物,并赋予其名称。要想在变量中存储一些东西,这样:\nticket = [14, 37, 18].

\n\n

2/8

\n\n

总共有八个部分。你已经走了八分之二了!这很简单,\n你不觉得吗?后面还有更好玩的东西。

\n\n

让我们改变一下方向。我在某个变量里给你塞了首诗。\n看一看。输入:

\n\n
puts poem\n
\n","load_code":"poem = \"My toast has flown from my hand\\nAnd my toast has gone to the moon.\\nBut when I saw it on television,\\nPlanting our flag on Halley's comet,\\nMore still did I want to eat it.\\n\""}, "19":{"lang":"ZH","title":"真是悲哀啊,最讨厌有吐司的诗了","chapter":"N","answer":"(toast){0}","ok":"棒极了","error":"还有吐司的味道。","text":"

看,这诗不错。你不需要喜欢它。\n随便修改,可以把toast改成各种瓜。\n试试下面这个,然后检查一下新的诗:

\n\n
poem.gsub("toast", "honeydew")\n
\n\n

gsub 方法是global substitute的缩写。\n它会将所有"toast"替换为"honeydew"。

\n","load_code":"prev"}, -"20":{"lang":"ZH","title":"摆好姿势,瞄准","chapter":"N","answer":"^\\n.ti tae ot (.+)","ok":"好的,当然。所以整首诗被倒着写了。","error":"","text":"

有一个问题:当我们逆置整首诗会发生什么?

\n\n
poem.reverse\n
\n","load_code":"prev"}, +"20":{"lang":"ZH","title":"摆好姿势,瞄准","chapter":"N","answer":"dnah ym morf nwolf sah tsaot yM","ok":"好的,当然。所以整首诗被倒着写了。","error":"","text":"

有一个问题:当我们逆置整首诗会发生什么?

\n\n
poem.reverse\n
\n","load_code":"prev"}, "21":{"lang":"ZH","title":"太多逆置了","chapter":"N","answer":"^\\[\"More still did (.+)","ok":"差不多是我们想要的了","error":"","text":"

所以整首诗按照字母的顺序,被逐一倒置了。这显然不是我想要的。我期望按照行的顺序进行倒置,比如第一行变成最后一行。那么如下操作:

\n\n
poem.lines.reverse\n
\n\n

把最后一行移到第一行,把第一行移到最后一行。

\n","load_code":"prev"}, -"22":{"lang":"ZH","title":"链式方法的小环","chapter":"N","answer":"^More still did (.+)","ok":"好样的,我的朋友!
join方法把那个数组的行数放在一起,变成一个字符串。","error":"","text":"

那么你看到了什么?那里发生了什么?你输入了 poem.lines.reverse,发生了什么?

\n\n

发生了两件事。你用lines把诗变成了一个列表。\nLines 决定了字符串被分割的方式,并将其转换为一个数组。

\n\n

然后,你反转了这个列表。每一行都是。你反转了它们。就这样了。

\n\n

让我们再把一个方法放在最后:

\n\n
puts poem.lines.reverse.join\n
\n\n

像这样的方法组合被称为方法链

\n","load_code":"prev"}, +"22":{"lang":"ZH","title":"链式方法的小环","chapter":"N","answer":"My toast has flown from my hand","ok":"好样的,我的朋友!
join方法把那个数组的行数放在一起,变成一个字符串。","error":"","text":"

那么你看到了什么?那里发生了什么?你输入了 poem.lines.reverse,发生了什么?

\n\n

发生了两件事。你用lines把诗变成了一个列表。\nLines 决定了字符串被分割的方式,并将其转换为一个数组。

\n\n

然后,你反转了这个列表。每一行都是。你反转了它们。就这样了。

\n\n

让我们再把一个方法放在最后:

\n\n
puts poem.lines.reverse.join\n
\n\n

像这样的方法组合被称为方法链

\n","load_code":"prev"}, "23":{"lang":"ZH","title":"这里是总结(三)","chapter":"Y","answer":"\\{\\}","ok":"创建了空hash!","error":"","text":"

感叹号

\n\n

方法的名称中可能有感叹号(也有问号)。\n这些只是为了更好地解释它们的功能。没什么大不了的。

\n\n

字符串操作

\n\n

搜索和更改字符串

\n\n

链接

\n\n

链接方法可以让您完成更多的工作。将一首诗分解,倒写,重新组合:\npoem.lines.reverse.join

\n\n

你还想再弄点诗吗?\nstring的所有方法列表在这里.

\n\n

试试看这些吧: poem.downcase or poem.swapcase

\n\n

准备好了?

\n\n

准备好继续的话,输入:

\n\n
books = {}\n
\n","load_code":"prev"}, "24":{"lang":"ZH","title":"一本空白的小书","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"是的,这是一个新的评论","error":"splendid, quite_good, mediocre, quite_not_good, abysmal.
请使用其中之一。另外,不要忘记冒号。","text":"

现在制作的是空的 哈希(hash)。哈希就像数组一样,不同之处在于每个元素都有自己的名字。

\n\n

我们要在新的哈希中塞进一些简易的书评,\n评价体系如下。

\n\n
    \n
  • :splendid → 大师之作
  • \n
  • :quite_good → 很享受,啊对
  • \n
  • :mediocre → 半好半坏
  • \n
  • :quite_not_good → 特别差
  • \n
  • :abysmal → 热气腾腾的残骸
  • \n
\n\n

要给一本书评分,把书名放在方括号里,把评分放在等号后面。比如说:

\n\n
books["Gravitys Rainbow"] = :splendid\n
\n\n
\n

现在我想应该告诉你,TryRuby的所有课程都是相互独立的。\n所以,如果你在这里疯狂地输入书评,你只能在这一课中使用它们。 \n如果你想在下一课使用你的评论,你应该复制/粘贴它们。 \n不要太担心这个,每一课都有很多预定义的东西供你玩耍。

\n
\n","load_code":"books = {}"}, "25":{"lang":"ZH","title":"更多的评论","chapter":"N","answer":"[3-9]","ok":"看到了吧,length方法不仅可以用于字符串,还可以用于数组和哈希。","error":"","text":"

继续增加书评吧。\n要查看完整的列表,输入 puts books

\n\n

再重复一遍,评价体系是:splendid、:quitegood、:mediocre、:quitenot\\ _good、:abysmal。

\n\n

这些评价不是一串文字。在单词前面加冒号的话,那个就变成了 符号。\n从计算机存储器的角度来看,符号比字符串成本更低。\n如果你在程序中不断重复使用相同的单词,你就应该使用符号。\n不是在内存上有那个单词的数千个副本,而是计算机只存储符号 一次

\n\n

更重要的是,用符号来表示它会告诉电脑这不仅仅是一个单词,而是在程序中有意义的。

\n\n

如果输入了两个以上的书评,请使用 books.length 确认哈希中有哪些书评:

\n\n
books["The deep end"]  = :abysmal\nbooks["Living colors"] = :mediocre\n\nputs books\n\nputs books.length\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid}"}, "26":{"lang":"ZH","title":"等等,我喜欢Gravity's Rainbow吗?","chapter":"N","answer":"^(splendid|quite_good|mediocre|quite_not_good|abysmal)$","ok":"我超级喜欢","error":"","text":"

Ruby的优点之一是名字经常被重复使用。\n多亏了这个,必须要记住的名字变少了。

\n\n

还记得从数组中提取元素的时候,像 puts ticket[1] 那样需要使用数值吗?

\n\n

哈希也可以用同样的方法提取元素。但是,使用名字而不是数值。

\n\n

假设你想检查旧的书评。在括号里输入书名。但把等号去了。\n如下所示:

\n\n
puts books["Gravitys Rainbow"]\n
\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre}"}, "27":{"lang":"ZH","title":"哈希是成对的","chapter":"N","answer":"^\\[\".*\"\\]","ok":"你找到键(keys)了","error":"","text":"

记住哈希并不会把储存的东西排好序,那不是它的工作,它只会把东西配对。\n两个东西:

\n\n

在你的评论中,书名是键,书评是值

\n\n

如果你想看你评论过的书的题目:

\n\n
books.keys\n
\n\n

你可以方法换成.values

\n","load_code":"prev"}, -"28":{"lang":"ZH","title":"你标准很高?","chapter":"N","answer":"\"mediocre\"","ok":"不错,你已经为你的书评做了一个评分卡了","error":"","text":"

你写了刻薄或不公平的书评吗?\n那么,让我们准备一个名为 ratings 的新的哈希来打分吧。

\n\n

怎么做呢?对啊,就是不断地增加书评。请输入以下内容:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

代码中的直线是管道字符,位于键盘中Enter键的正上方

\n\n

+= 1表示:值增加1。

\n\n

如果你不明白这里发生的一切,也不要担心。这将在稍后揭晓。

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, +"28":{"lang":"ZH","title":"你标准很高?","chapter":"N","answer":":mediocre","ok":"不错,你已经为你的书评做了一个评分卡了","error":"","text":"

你写了刻薄或不公平的书评吗?\n那么,让我们准备一个名为 ratings 的新的哈希来打分吧。

\n\n

怎么做呢?对啊,就是不断地增加书评。请输入以下内容:

\n\n
ratings = Hash.new {0}\n\nbooks.values.each { |rate|\n  ratings[rate] += 1\n}\n\nputs ratings\n
\n\n

代码中的直线是管道字符,位于键盘中Enter键的正上方

\n\n

+= 1表示:值增加1。

\n\n

如果你不明白这里发生的一切,也不要担心。这将在稍后揭晓。

\n","load_code":"books = {\"Gravitys Rainbow\" => :splendid, \"The deep end\" => :abysmal, \"Living colors\" => :mediocre, \"Bumblebees\" => :mediocre}"}, "29":{"lang":"ZH","title":"一个统计","chapter":"N","answer":"\\w+","ok":"Yodelay!","error":"","text":"

我们刚刚使用的一个美妙的新东西是 块(block)。我们将进一步探讨这些问题\n在这一课和下一课。但是,基本上,块是由花括号包围的一小段Ruby代码\n括号。

\n\n

试一试另一个块:

\n\n
5.times { print "Odelay! " }\n
\n\n

块总是附加到方法上。比如 times 方法,这个块将\n一遍又一遍地运行代码。(在这个例子中,它将运行五次。)

\n","load_code":""}, "30":{"lang":"ZH","title":"你有时间吗?","chapter":"N","answer":"^[0-9]$","ok":"次数对了","error":"让这些块运行0次到9次","text":"

从第一个运用块的例子我们可以看到(在数评分时),我们可以给块传值。传什么值由控制块的方法来决定。

\n\n

块中 收到(received) 的值被放在块开头的在两个管道符号之间的变量名中: |

\n\n

Let’s try that with this block:

\n\n
5.times { |time|\n  puts time\n}\n
\n\n

这里,方法 .times 给变量 |time| 传了一个值。但是注意这个变量仅在块中有效。

\n\n
\n

你可以尝试把代码分成几段,可以有助于你理解。

\n
\n","load_code":""}, "31":{"lang":"ZH","title":"现在到了总结#4","chapter":"Y","answer":"","ok":"","error":"","text":"

这最后一课稍微长一点。你可能已经用了三分钟的时间来学习:

\n\n

哈希

\n\n

带有卷页的小字典:{}

\n\n

符号

\n\n

带有冒号的微小、高效的代码,比如::splendid

\n\n

\n\n

可以添加到许多Ruby方法中的代码块。这是你用过的代码\n建立一个记分卡:\nbooks.values.each { |rate| ratings[rate] += 1 }

\n\n

下一节

\n\n

下一课我们将更深入地探讨方法。

\n","load_code":""}, @@ -35,7 +35,7 @@ "35":{"lang":"ZH","title":"自己创造的成熟的果实","chapter":"N","answer":"^Tamed a shrew","ok":"这将让那些泼妇看到","error":"","text":"

一个新的方法诞生了,让我们马上调用一下:

\n\n
tame 5\n
\n","load_code":"def tame(number_of_shrews);number_of_shrews.times{puts \"Tamed a shrew\"};end;"}, "36":{"lang":"ZH","title":"奉献与索取","chapter":"N","answer":"\\d+","ok":"不错。好样的。","error":"","text":"

大多数方法不仅需要一些参数作为输入,而且也会 返回 一些东西。\n我对我们的方法做了一些改变,所以它将返回一个值给你。试试吧:

\n\n
def tame( number_of_shrews )\n  number_of_shrews.times {\n    puts "Tamed a shrew"\n  }\n  return number_of_shrews\nend\n\nputs tame(3)\n
\n\n

返回

\n\n

那么,既然你在这里变得如此高阶和能干,给你提示。\n你可以在方法的最后一行省略 return 这个词。\nRuby将自动返回方法中最后使用的值。

\n\n

所以我们修改最后一行为: number_of_shrews.

\n\n

但是既然方法 .times 也返回 number_of_shrews 我么可以省去最后一整行,所以我们最初的方法已经做到了我们一直想做的事情。

\n","load_code":""}, "37":{"lang":"ZH","title":"你好,谁在那里?总结#5挥舞着它的帽子!","chapter":"Y","answer":"","ok":"","error":"","text":"

做得好,做得好,做得好,做得好!

\n\n

真的,真的,真的,真的,真真真真真真真的!

\n\n

这里是你生命中上几分钟的回顾。

\n\n

方法

\n\n

方法可以用 def 来定义,并且有一个名字。方法使你的程序更短,\n而且更容易阅读。

\n\n

参数

\n\n

方法可以有参数。

\n\n

返回值

\n\n

方法(几乎)总是返回一个值。

\n\n

现在

\n\n

To (be) or not to (be) 不再是一个问题了。准备好看更多的莎士比亚了吗?

\n","load_code":""}, -"38":{"lang":"ZH","title":"世界是我们的囊中之物","chapter":"N","answer":"^\\{\\\"William","ok":"很好。有点难读。","error":"","text":"

目前我们只运行了我们输入的程序,这很棒,展示出来的信息是史诗级的,但如今是互联网纪元,\n所以是时候把全世界囊括进我们的程序中了。

\n\n

许多,许多,许多网站你可以用来获取信息,比如这个获取关于Ruby的Google新闻资讯

\n\n

你的网络浏览器可能会很好地为你显示它。如果你看一下源代码\n(键入:Control-U),你会看到一长串格式奇怪的文本。以谷歌为例,\n它是以rss格式显示的。

\n\n

格式

\n\n

还有许多其他格式,名字很奇怪,在网络上可以使用,比如。\nhtml、xml和json。是的,甚至这个网站也使用其中的一些格式。

\n\n

我为你准备了一个方法,可以从互联网上获取威廉-莎士比亚的全部作品的清单。\n(别担心,它实际上来自本网站运行的同一服务器,所以,\n我们没有打扰到任何人。)

\n\n

获取数据:

\n\n
get_shakey\n
\n","load_code":"def get_shakey;JSON.parse(\"{\\\"William Shakespeare\\\": {\\\"1\\\": {\\\"title\\\": \\\"The Two Gentlemen of Verona\\\", \\\"finished\\\": 1591},\\\"2\\\": {\\\"title\\\": \\\"The Taming of the Shrew\\\", \\\"finished\\\": 1591},\\\"3\\\": {\\\"title\\\": \\\"Henry VI, Part 2\\\", \\\"finished\\\": 1591},\\\"4\\\": {\\\"title\\\": \\\"Henry VI, Part 3\\\", \\\"finished\\\": 1591},\\\"5\\\": {\\\"title\\\": \\\"Henry VI, Part 1\\\", \\\"finished\\\": 1592},\\\"6\\\": {\\\"title\\\": \\\"Titus Andronicus\\\", \\\"finished\\\": 1592},\\\"7\\\": {\\\"title\\\": \\\"Richard III\\\", \\\"finished\\\": 1593},\\\"8\\\": {\\\"title\\\": \\\"Edward III\\\", \\\"finished\\\": 1593},\\\"9\\\": {\\\"title\\\": \\\"The Comedy of Errors\\\", \\\"finished\\\": 1594},\\\"10\\\": {\\\"title\\\": \\\"Love's Labour's Lost\\\", \\\"finished\\\": 1595},\\\"11\\\": {\\\"title\\\": \\\"Love's Labour's Won\\\", \\\"finished\\\": 1596},\\\"12\\\": {\\\"title\\\": \\\"Richard II\\\", \\\"finished\\\": 1595},\\\"13\\\": {\\\"title\\\": \\\"Romeo and Juliet\\\", \\\"finished\\\": 1595},\\\"14\\\": {\\\"title\\\": \\\"A Midsummer Night's Dream\\\", \\\"finished\\\": 1595},\\\"15\\\": {\\\"title\\\": \\\"King John\\\", \\\"finished\\\": 1596},\\\"16\\\": {\\\"title\\\": \\\"The Merchant of Venice\\\", \\\"finished\\\": 1597},\\\"17\\\": {\\\"title\\\": \\\"Henry IV, Part 1\\\", \\\"finished\\\": 1597},\\\"18\\\": {\\\"title\\\": \\\"The Merry Wives of Windsor\\\", \\\"finished\\\": 1597},\\\"19\\\": {\\\"title\\\": \\\"Henry IV, Part 2\\\", \\\"finished\\\": 1598},\\\"20\\\": {\\\"title\\\": \\\"Much Ado About Nothing\\\", \\\"finished\\\": 1599},\\\"21\\\": {\\\"title\\\": \\\"Henry V\\\", \\\"finished\\\": 1599},\\\"22\\\": {\\\"title\\\": \\\"Julius Caesar\\\", \\\"finished\\\": 1599},\\\"23\\\": {\\\"title\\\": \\\"As You Like It\\\", \\\"finished\\\": 1600},\\\"24\\\": {\\\"title\\\": \\\"Hamlet\\\", \\\"finished\\\": 1601},\\\"25\\\": {\\\"title\\\": \\\"Twelfth Night\\\", \\\"finished\\\": 1601},\\\"26\\\": {\\\"title\\\": \\\"Troilus and Cressida\\\", \\\"finished\\\": 1602},\\\"27\\\": {\\\"title\\\": \\\"Sir Thomas More\\\", \\\"finished\\\": 1604},\\\"28\\\": {\\\"title\\\": \\\"Measure for Measure\\\", \\\"finished\\\": 1604},\\\"29\\\": {\\\"title\\\": \\\"Othello\\\", \\\"finished\\\": 1604},\\\"30\\\": {\\\"title\\\": \\\"All's Well That Ends Well\\\", \\\"finished\\\": 1605},\\\"31\\\": {\\\"title\\\": \\\"King Lear\\\", \\\"finished\\\": 1606},\\\"32\\\": {\\\"title\\\": \\\"Timon of Athens\\\", \\\"finished\\\": 1606},\\\"33\\\": {\\\"title\\\": \\\"Macbeth\\\", \\\"finished\\\": 1606},\\\"34\\\": {\\\"title\\\": \\\"Antony and Cleopatra\\\", \\\"finished\\\": 1606},\\\"35\\\": {\\\"title\\\": \\\"Pericles, Prince of Tyre\\\", \\\"finished\\\": 1608},\\\"36\\\": {\\\"title\\\": \\\"Coriolanus\\\", \\\"finished\\\": 1608},\\\"37\\\": {\\\"title\\\": \\\"The Winter's Tale\\\", \\\"finished\\\": 1611},\\\"38\\\": {\\\"title\\\": \\\"Cymbeline\\\", \\\"finished\\\": 1610},\\\"39\\\": {\\\"title\\\": \\\"The Tempest\\\", \\\"finished\\\": 1611},\\\"40\\\": {\\\"title\\\": \\\"Cardenio\\\", \\\"finished\\\": 1613},\\\"41\\\": {\\\"title\\\": \\\"Henry VIII\\\", \\\"finished\\\": 1613},\\\"42\\\": {\\\"title\\\": \\\"The Two Noble Kinsmen\\\", \\\"finished\\\": 1614}}}\");end;"}, +"38":{"lang":"ZH","title":"世界是我们的囊中之物","chapter":"N","answer":"^\\{\\\"William","ok":"很好。有点难读。","error":"","text":"

目前我们只运行了我们输入的程序,这很棒,展示出来的信息是史诗级的,但如今是互联网纪元,\n所以是时候把全世界囊括进我们的程序中了。

\n\n

许多,许多,许多网站你可以用来获取信息,比如这个获取关于Ruby的Google新闻资讯

\n\n

你的网络浏览器可能会很好地为你显示它。如果你看一下源代码\n(键入:Control-U),你会看到一长串格式奇怪的文本。以谷歌为例,\n它是以rss格式显示的。

\n\n

格式

\n\n

还有许多其他格式,名字很奇怪,在网络上可以使用,比如。\nhtml、xml和json。是的,甚至这个网站也使用其中的一些格式。

\n\n

我为你准备了一个方法,可以从互联网上获取威廉-莎士比亚的全部作品的清单。\n(别担心,它实际上来自本网站运行的同一服务器,所以,\n我们没有打扰到任何人。)

\n\n

获取数据:

\n\n
get_shakey\n
\n","load_code":"def get_shakey; {\"William Shakespeare\"=>{\"1\"=>{\"title\"=>\"The Two Gentlemen of Verona\", \"finished\"=>1591},\"2\"=>{\"title\"=>\"The Taming of the Shrew\", \"finished\"=>1591},\"3\"=>{\"title\"=>\"Henry VI, Part 2\", \"finished\"=>1591},\"4\"=>{\"title\"=>\"Henry VI, Part 3\", \"finished\"=>1591},\"5\"=>{\"title\"=>\"Henry VI, Part 1\", \"finished\"=>1592},\"6\"=>{\"title\"=>\"Titus Andronicus\", \"finished\"=>1592},\"7\"=>{\"title\"=>\"Richard III\", \"finished\"=>1593},\"8\"=>{\"title\"=>\"Edward III\", \"finished\"=>1593},\"9\"=>{\"title\"=>\"The Comedy of Errors\", \"finished\"=>1594},\"10\"=>{\"title\"=>\"Love's Labour's Lost\", \"finished\"=>1595},\"11\"=>{\"title\"=>\"Love's Labour's Won\", \"finished\"=>1596},\"12\"=>{\"title\"=>\"Richard II\", \"finished\"=>1595},\"13\"=>{\"title\"=>\"Romeo and Juliet\", \"finished\"=>1595},\"14\"=>{\"title\"=>\"A Midsummer Night's Dream\", \"finished\"=>1595},\"15\"=>{\"title\"=>\"King John\", \"finished\"=>1596},\"16\"=>{\"title\"=>\"The Merchant of Venice\", \"finished\"=>1597},\"17\"=>{\"title\"=>\"Henry IV, Part 1\", \"finished\"=>1597},\"18\"=>{\"title\"=>\"The Merry Wives of Windsor\", \"finished\"=>1597},\"19\"=>{\"title\"=>\"Henry IV, Part 2\", \"finished\"=>1598},\"20\"=>{\"title\"=>\"Much Ado About Nothing\", \"finished\"=>1599},\"21\"=>{\"title\"=>\"Henry V\", \"finished\"=>1599},\"22\"=>{\"title\"=>\"Julius Caesar\", \"finished\"=>1599},\"23\"=>{\"title\"=>\"As You Like It\", \"finished\"=>1600},\"24\"=>{\"title\"=>\"Hamlet\", \"finished\"=>1601},\"25\"=>{\"title\"=>\"Twelfth Night\", \"finished\"=>1601},\"26\"=>{\"title\"=>\"Troilus and Cressida\", \"finished\"=>1602},\"27\"=>{\"title\"=>\"Sir Thomas More\", \"finished\"=>1604},\"28\"=>{\"title\"=>\"Measure for Measure\", \"finished\"=>1604},\"29\"=>{\"title\"=>\"Othello\", \"finished\"=>1604},\"30\"=>{\"title\"=>\"All's Well That Ends Well\", \"finished\"=>1605},\"31\"=>{\"title\"=>\"King Lear\", \"finished\"=>1606},\"32\"=>{\"title\"=>\"Timon of Athens\", \"finished\"=>1606},\"33\"=>{\"title\"=>\"Macbeth\", \"finished\"=>1606},\"34\"=>{\"title\"=>\"Antony and Cleopatra\", \"finished\"=>1606},\"35\"=>{\"title\"=>\"Pericles, Prince of Tyre\", \"finished\"=>1608},\"36\"=>{\"title\"=>\"Coriolanus\", \"finished\"=>1608},\"37\"=>{\"title\"=>\"The Winter's Tale\", \"finished\"=>1611},\"38\"=>{\"title\"=>\"Cymbeline\", \"finished\"=>1610},\"39\"=>{\"title\"=>\"The Tempest\", \"finished\"=>1611},\"40\"=>{\"title\"=>\"Cardenio\", \"finished\"=>1613},\"41\"=>{\"title\"=>\"Henry VIII\", \"finished\"=>1613},\"42\"=>{\"title\"=>\"The Two Noble Kinsmen\", \"finished\"=>1614}}}; end;"}, "39":{"lang":"ZH","title":"两个高贵的亲戚","chapter":"N","answer":"^The Two Noble Kinsmen$","ok":"这看起来好多了","error":"","text":"

我们从网上搜集了一些剧本,剧本的清单储存在json格式中。\n幸运的是,Ruby提供了一个将json数据转化为Ruby哈希的方法。\nget_shakey方法能帮助我们。

\n\n

由于json的格式还是被保留在了哈希中,这还是有点难阅读的。\n让我们写一个能增加其可读性的方法。

\n\n

如果你仔细观察下面的代码,你会发现它们以一种嵌套结构排列。\n这种结构在互联网上可以经常见到

\n\n
    \n
  • “William Shakespeare”\n
      \n
    • “1”\n
        \n
      • “title”: “The Two Gentlemen of Verona”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • “2”\n
        \n
      • “title”: “The Taming of the= Shrew”
      • \n
      • “finished”: 1591
      • \n
      \n
    • \n
    • \n
    \n
  • \n
\n\n

要想列出剧本的名字我们要先通过找到哈希顶部的元素,也就是"William Shakespeare",然后对其下属的元素进行iterate(迭代) 搜索。\nRuby有一个用以迭代的方法。也就是each。我们在创建书评系统的时候曾用到过这个方法。

\n\n

所有由each 方法返回的值都传到了一个块中:

\n\n
s = get_shakey\n\ns["William Shakespeare"].each { |key, val|\n  puts val["title"]\n}\n
\n","load_code":"prev"}, "40":{"lang":"ZH","title":"全加在一起","chapter":"N","answer":"^4$","ok":"没错,莎士比亚在1591年写了四部剧","error":"1591年的答案应该是4部","text":"

假如我们想要知道莎士比亚在某一特定的年份写的剧的名字和数量。

\n\n

Ruby提供了select 方法来检索哈希中的值。它能根据我们在块中的定义来检索并返回值

\n\n

我们利用在 each 方法中链接 select 方法。这种方法链接,我们已经在之前逆置诗的时候用过了。

\n\n

我已经替你定义好了 count_plays 你试着通过下面的代码来找出莎士比亚在1591年写了多少剧本吧:

\n\n
def count_plays(year)\n  s = get_shakey\n\n  s["William Shakespeare"]\n    .select { |k, v|\n      v["finished"] == year\n    }.each { |key, val|\n      puts val["title"]\n    }.count\nend\n\nputs count_plays(0)\n
\n\n

你注意到我在each方法的结尾链接了count方法吗。这将给我们一个 count_plays 方法的返回值。

\n\n

有另一种写法,可以直接把 [“William Shakespeare”].select { |k, v| 写在 s = getshakey 后面。(不需要加.)

\n","load_code":"prev"}, "41":{"lang":"ZH","title":"一切都是美好的结局","chapter":"N","answer":"All's Well That Ends Well","ok":"True","error":"把1605作为第二个参数","text":"

好了,我们从互联网上得到了一些数据,我们选择了我们想要的东西并把它打印出来。\n还有什么需要改进的呢?我们可以把结果打印得更漂亮一点。比如添加年份,\n并将剧名和年份对齐。

\n\n

这意味着在一行中打印多个值。Ruby有一个很好的方法来实现。\n就如同打印一个字符串一样,如: puts “Hi, my name is Jimmy”。\n但我们要把Jimmy换成一个变量\n所以我们可以这样写:\n “Hi, my name is #{name}”

\n\n

第一步,把 Jimmy#{} 代替。Ruby会为这个括号寻找所放进去的变量\n让我们修改一下我们的代码:

\n\n
def print_plays(year_from, year_to)\n  get_shakey["William Shakespeare"]\n    .select { |k, v|\n      year_from <= v["finished"] &&\n      year_to   >= v["finished"]\n    }.each { |k, v|\n      puts "#{v["title"].ljust(30)} #{v["finished"]}"\n    }\nend\nprint_plays(1600, 1605)\n
\n\n

这个方法 .ljust(30) 的作用是,将打印出来的内容 左对齐(left justified) 给剧名占用30个字符大小,这样年份就会漂亮的对齐了。

\n\n

试试看你能不能修改一下代码,把内容以这样的形式打印出来:1600 -> As You Like It\n一切都是美好的结局? 嘿,我们还没学完了,不过也快了!

\n","load_code":"prev"}, @@ -47,7 +47,7 @@ "47":{"lang":"ZH","title":"App的内容","chapter":"N","answer":"","ok":"","error":"","text":"

你已经创建了一个新的BlurbTM类。你会怎样设计界面?\n信息BlurbTM的内容,当然。并且,发送的时间,还有情绪。

\n\n

好的,下面是Blurb类的余下定义:

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\nend\n
\n\n

类的名称始终以大写字母为开头。

\n\n

(仍然没有输出)

\n","load_code":""}, "48":{"lang":"ZH","title":"存储器是悬空的星星的角","chapter":"N","answer":"Blurb:","ok":"我的第一个Blurb","error":"","text":"

嘿,不错的类。你已经有了一个新BlurbTM类。

\n\n

在类的定义中,你使用了attr_accessor方法。\n在类定义中有很多像这样的 attr(属)ibute(性)方法或者其他的一些小设定。\n这些属性是附着在类中的变量。

\n\n

这样,把类想象成一个五角星,那些属性就是星星的角,共同组成了它。

\n\n

现在

\n\n

创建一个BlurbTM并设定好内容:

\n\n
blurb1 = Blurb.new\nputs blurb1\nblurb1.content = "Today Mount Hood Was Stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;end"}, "49":{"lang":"ZH","title":"一个对象,整洁的小包裹","chapter":"N","answer":"Blurb:","ok":"Blurb已更新","error":"","text":"

继续设置BlurbTM的时间和心情:

\n\n
blurb1.time = Time.now\nblurb1.mood = :sick\n\nputs blurb1\n
\n","load_code":"prev;blurb1=Blurb.new;blurb1.content=\"Today Mount Hood Was Stolen!\""}, -"50":{"lang":"ZH","title":"让它更快","chapter":"N","answer":"^\\d{4}","ok":"Noted","error":"","text":"

不错,你的app很棒。嘿,让我们把这件事情简化一下。\n你不会每次发BlurbTM都想手动加一下时间的。

\n\n

每次只手动写内容和心情对吧?

\n\n

让我们把 initialize 方法增加到类中。这个方法在会在每条BlurbTM创建的时候都被调用。

\n\n

同时我们可以限制BlurbTM长度为40个字符。

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new.time\n
\n\n

(参数 content=“” 是为了确保即使没有content参数被传入初始化方法中,\ncontent也是字符串。)

\n","load_code":""}, +"50":{"lang":"ZH","title":"让它更快","chapter":"N","answer":"^\\d{4}","ok":"Noted","error":"","text":"

不错,你的app很棒。嘿,让我们把这件事情简化一下。\n你不会每次发BlurbTM都想手动加一下时间的。

\n\n

每次只手动写内容和心情对吧?

\n\n

让我们把 initialize 方法增加到类中。这个方法在会在每条BlurbTM创建的时候都被调用。

\n\n

同时我们可以限制BlurbTM长度为40个字符。

\n\n
class Blurb\n  attr_accessor :content, :time, :mood\n\n  def initialize(mood, content="")\n    @time    = Time.now\n    @content = content[0..39]\n    @mood    = mood\n  end\nend\n\nBlurb.new(:sick).time\n
\n\n

(参数 content=“” 是为了确保即使没有content参数被传入初始化方法中,\ncontent也是字符串。)

\n","load_code":""}, "51":{"lang":"ZH","title":"你教会了你的app拒绝做无意义的事","chapter":"N","answer":"Blurb:","ok":"Blurb已添加","error":"","text":"

你注意到在类的内部我们使用了@(@time)吗?\n在类 之外,我们用存储器:

\n\n
\n

blurb.time = Time.now

\n
\n\n

但是在类 之内 我们用 对象的变量:

\n\n
\n

@time = Time.now

\n
\n\n

They’re the exact same thing, but expressed in two different places of your program.\n这两种方式是等效的,只是在程序的不同地方表达了。

\n\n

创建另一个BlurbTM

\n\n

当一个新的BlurbTM被创建了,初始化方法将被用来检查是否有新的参数传入。

\n\n

额,我们需要两个新参数:

\n\n
Blurb2 = Blurb.new :confused, "I can not believe Mt. Hood was stolen!"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,\"Today Mount Hood Was Stolen!\")"}, "52":{"lang":"ZH","title":"长颈鹿没有偷总结 #7","chapter":"Y","answer":"","ok":"","error":"","text":"

啊哈,你已经到这了,还完完整整的嘛。我们仍将努力使你的app成为现实,\n但是现在,我们来回顾一下。

\n\n

\n\n

Everything in Ruby is some kind of object. Classes explain objects, how a certain object works.\nFor example, you made a few BlurbTM objects and these objects are explained in the Blurb\nclass.\nIn other words: you call them Blurb objects.\nYou can use classes to (kinda) model real life objects.\n在Ruby中,一切皆对象。类会解释一个特定的对象是怎么工作的。\n比如,你创建了几个BlurbTM对象并且在BlurbTM类中对其进行了解释。\n换句话说:你把他们叫做Blurb对象。\n你可以用类来搭建真实生活中的对象。

\n\n

Accessors(存储器)

\n\n

存储器是附着在对象中的可以在对象 被调用的变量。\n(blurb2.time = Time.now)

\n\n

对象变量

\n\n

对象变量就是用以存储器的变量,两者相同,但是在对象 。\n(@time = Time.now)

\n","load_code":"prev;blurb2=Blurb.new :confused, \"I can not believe Mt. Hood was stolen!\""}, "53":{"lang":"ZH","title":"你自己的草场","chapter":"N","answer":"Blurbalizer:","ok":"我的app创建完成","error":"","text":"

好了,让我们把一切打包,孩子。接下来将是史诗般的Ruby冒险的最后一章!\n现在你已经对一切如何运行有了大概的理解,那如何把它们整合起来使用呢?\n你是一个很优秀的人(我最喜欢的人之一),但是你需要指引。

\n\n

让我们完成你的app

\n\n

你已经搭建了app的主框架,但还没有真正的app。\n你需要一个地方来保存BlurbsTM,和一个时间线来记录信息。

\n\n

想不到吧,我们要再创建一个类。我把新类的代码一次性全贴出来了。\n你可以 慢慢学习。\n我可不急,我在下一节课等你。

\n\n
class Blurbalizer\n  def initialize(title)\n    @title  = title\n    @blurbs = [] # 用来储存Blurbs\n                 # 的新数组\n  end\n\n  def add_a_blurb(mood, content)\n    # 其中 << 意为添加到数组尾部\n    @blurbs << Blurb.new(mood, content)\n  end\n\n  def show_timeline\n    puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs"\n\n    @blurbs.sort_by { |t|\n      t.time\n    }.reverse.each { |t|\n      puts "#{t.content.ljust(40)} #{t.time}"\n    }\n  end\nend\n\nmyapp = Blurbalizer.new "The Big Blurb"\n
\n","load_code":"class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content=\"\");@time=Time.now;@content=content[0..39];@mood=mood;end;end"}, diff --git a/spec/tutorial_spec.rb b/spec/tutorial_spec.rb index d1496620..13d67e06 100644 --- a/spec/tutorial_spec.rb +++ b/spec/tutorial_spec.rb @@ -16,11 +16,6 @@ dataset = language_dataset(language) - it "displays a correct title on the first page of the tutorial" do - page.should have_content(dataset["1"]["title"]) - the_cookie_of_step.should be == 1 - end - steps = { 1 => {pass: true}, 12 => {code: "[12, 47, 35, 1]"}, @@ -80,6 +75,11 @@ end end end + + it "displays a correct title on the first page of the tutorial" do + page.should have_content(dataset["1"]["title"]) + the_cookie_of_step.should be == 1 + end end end end diff --git a/translations/en/try_ruby_200.md b/translations/en/try_ruby_200.md index 9033f3d0..aa735a8d 100644 --- a/translations/en/try_ruby_200.md +++ b/translations/en/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: EN title: Ready, Aim -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: Okay, sure. So the whole poem has been turned backwards. error: diff --git a/translations/en/try_ruby_220.md b/translations/en/try_ruby_220.md index b6bfbe74..21c84f00 100644 --- a/translations/en/try_ruby_220.md +++ b/translations/en/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: EN title: Ringlets of Chained Methods -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: Good show, my friend!
The join method took that array of lines and put them together into a string. error: diff --git a/translations/en/try_ruby_280.md b/translations/en/try_ruby_280.md index 3097fd4d..df1f0032 100644 --- a/translations/en/try_ruby_280.md +++ b/translations/en/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: EN title: Are You Harsh? -answer: "mediocre" +answer: :mediocre load: books = {"Gravitys Rainbow" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre, "Bumblebees" => :mediocre} ok: Great, wow! You've made a scorecard of your ratings error: diff --git a/translations/en/try_ruby_380.md b/translations/en/try_ruby_380.md index 95c98b41..a18fa7b4 100644 --- a/translations/en/try_ruby_380.md +++ b/translations/en/try_ruby_380.md @@ -4,7 +4,7 @@ title: The world is our oyster answer: ^\{\"William ok: Good. Bit difficult to read. error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- So far we have been running programs that only use things that we have typed ourselves. diff --git a/translations/en/try_ruby_500.md b/translations/en/try_ruby_500.md index 26dc29ec..e64019dc 100644 --- a/translations/en/try_ruby_500.md +++ b/translations/en/try_ruby_500.md @@ -25,7 +25,7 @@ At the same time we can limit the length of the BlurbTM content to 40 end end - Blurb.new.time + Blurb.new(:sick).time (That parameter __content=""__ is there to make sure that we know content is a string, even if no content parameter is passed to the initialize method.) diff --git a/translations/es/try_ruby_200.md b/translations/es/try_ruby_200.md index f93679c7..278e1de4 100644 --- a/translations/es/try_ruby_200.md +++ b/translations/es/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: ES title: Apunten. Fuego -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: De acuerdo, sí. Se ha dado la vuelta el poema entero. error: diff --git a/translations/es/try_ruby_220.md b/translations/es/try_ruby_220.md index 312db4d1..c91d09cf 100644 --- a/translations/es/try_ruby_220.md +++ b/translations/es/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: ES title: Tirabuzón de Métodos en Cadena -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: Bien hecho, amigo mío.
El método join cogió el array de líneas y las puso juntas en un string. error: diff --git a/translations/es/try_ruby_280.md b/translations/es/try_ruby_280.md index 30e8b659..a4ee097a 100644 --- a/translations/es/try_ruby_280.md +++ b/translations/es/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: ES title: ¿Eres severo? -answer: "mediocre" +answer: :mediocre load: libros = {"El Arco Iris de Gravedad" => :esplendido, "El fin profundo" => :abismal, "Colores vivientes" => :mediocre, "Abejorros" => :mediocre} ok: ¡Genial! Has hecho un marcador de puntuaciones. error: diff --git a/translations/es/try_ruby_380.md b/translations/es/try_ruby_380.md index f338af94..d2662fba 100644 --- a/translations/es/try_ruby_380.md +++ b/translations/es/try_ruby_380.md @@ -4,7 +4,7 @@ title: El mundo es nuestro answer: ^\{\"William ok: Bien. Un poco difícil de leer error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"titulo\": \"Los dos hidalgos de Verona\", \"terminado\": 1591},\"2\": {\"titulo\": \"La fierecilla domada\", \"terminado\": 1591},\"3\": {\"titulo\": \"Enrique VI, Parte 2\", \"terminado\": 1591},\"4\": {\"titulo\": \"Enrique VI, Parte 3\", \"terminado\": 1591},\"5\": {\"titulo\": \"Enrique VI, Parte 1\", \"terminado\": 1592},\"6\": {\"titulo\": \"Tito Andrónico\", \"terminado\": 1592},\"7\": {\"titulo\": \"Ricardo III\", \"terminado\": 1593},\"8\": {\"titulo\": \"Eduardo III\", \"terminado\": 1593},\"9\": {\"titulo\": \"La comedia de las equivocaciones\", \"terminado\": 1594},\"10\": {\"titulo\": \"Trabajos de amor perdidos\", \"terminado\": 1595},\"11\": {\"titulo\": \"Trabajos de amor ganados\", \"terminado\": 1596},\"12\": {\"titulo\": \"Ricardo II\", \"terminado\": 1595},\"13\": {\"titulo\": \"Romeo y Julieta\", \"terminado\": 1595},\"14\": {\"titulo\": \"El sueño de una noche de verano\", \"terminado\": 1595},\"15\": {\"titulo\": \"El rey Juan\", \"terminado\": 1596},\"16\": {\"titulo\": \"El mercader de Venecia\", \"terminado\": 1597},\"17\": {\"titulo\": \"Enrique IV, Parte 1\", \"terminado\": 1597},\"18\": {\"titulo\": \"Las alegres comadres de Windsor\", \"terminado\": 1597},\"19\": {\"titulo\": \"Enrique IV, Parte 2\", \"terminado\": 1598},\"20\": {\"titulo\": \"Mucho ruido y pocas nueces\", \"terminado\": 1599},\"21\": {\"titulo\": \"Enrique V\", \"terminado\": 1599},\"22\": {\"titulo\": \"Julio Cesar\", \"terminado\": 1599},\"23\": {\"titulo\": \"Como gustéis\", \"terminado\": 1600},\"24\": {\"titulo\": \"Hamlet\", \"terminado\": 1601},\"25\": {\"titulo\": \"La decimosegunda noche\", \"terminado\": 1601},\"26\": {\"titulo\": \"Troilo y Crésida\", \"terminado\": 1602},\"27\": {\"titulo\": \"Tomás Moro\", \"terminado\": 1604},\"28\": {\"titulo\": \"Medida por medida\", \"terminado\": 1604},\"29\": {\"titulo\": \"Otelo\", \"terminado\": 1604},\"30\": {\"titulo\": \"A buen fin no hay mal tiempo\", \"terminado\": 1605},\"31\": {\"titulo\": \"El rey Lear\", \"terminado\": 1606},\"32\": {\"titulo\": \"Timón de Atenas\", \"terminado\": 1606},\"33\": {\"titulo\": \"Macbeth\", \"terminado\": 1606},\"34\": {\"titulo\": \"Antonio y Cleopatra\", \"terminado\": 1606},\"35\": {\"titulo\": \"Pericles\", \"terminado\": 1608},\"36\": {\"titulo\": \"Coriolano\", \"terminado\": 1608},\"37\": {\"titulo\": \"Cuento de invierno\", \"terminado\": 1611},\"38\": {\"titulo\": \"Cimbelino\", \"terminado\": 1610},\"39\": {\"titulo\": \"La tempestad\", \"terminado\": 1611},\"40\": {\"titulo\": \"Cardenio\", \"terminado\": 1613},\"41\": {\"titulo\": \"Enrique VIII\", \"terminado\": 1613},\"42\": {\"titulo\": \"Los dos nobles caballeros\", \"terminado\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"titulo"=>"Los dos hidalgos de Verona", "terminado"=>1591},"2"=>{"titulo"=>"La fierecilla domada", "terminado"=>1591},"3"=>{"titulo"=>"Enrique VI, Parte 2", "terminado"=>1591},"4"=>{"titulo"=>"Enrique VI, Parte 3", "terminado"=>1591},"5"=>{"titulo"=>"Enrique VI, Parte 1", "terminado"=>1592},"6"=>{"titulo"=>"Tito Andrónico", "terminado"=>1592},"7"=>{"titulo"=>"Ricardo III", "terminado"=>1593},"8"=>{"titulo"=>"Eduardo III", "terminado"=>1593},"9"=>{"titulo"=>"La comedia de las equivocaciones", "terminado"=>1594},"10"=>{"titulo"=>"Trabajos de amor perdidos", "terminado"=>1595},"11"=>{"titulo"=>"Trabajos de amor ganados", "terminado"=>1596},"12"=>{"titulo"=>"Ricardo II", "terminado"=>1595},"13"=>{"titulo"=>"Romeo y Julieta", "terminado"=>1595},"14"=>{"titulo"=>"El sueño de una noche de verano", "terminado"=>1595},"15"=>{"titulo"=>"El rey Juan", "terminado"=>1596},"16"=>{"titulo"=>"El mercader de Venecia", "terminado"=>1597},"17"=>{"titulo"=>"Enrique IV, Parte 1", "terminado"=>1597},"18"=>{"titulo"=>"Las alegres comadres de Windsor", "terminado"=>1597},"19"=>{"titulo"=>"Enrique IV, Parte 2", "terminado"=>1598},"20"=>{"titulo"=>"Mucho ruido y pocas nueces", "terminado"=>1599},"21"=>{"titulo"=>"Enrique V", "terminado"=>1599},"22"=>{"titulo"=>"Julio Cesar", "terminado"=>1599},"23"=>{"titulo"=>"Como gustéis", "terminado"=>1600},"24"=>{"titulo"=>"Hamlet", "terminado"=>1601},"25"=>{"titulo"=>"La decimosegunda noche", "terminado"=>1601},"26"=>{"titulo"=>"Troilo y Crésida", "terminado"=>1602},"27"=>{"titulo"=>"Tomás Moro", "terminado"=>1604},"28"=>{"titulo"=>"Medida por medida", "terminado"=>1604},"29"=>{"titulo"=>"Otelo", "terminado"=>1604},"30"=>{"titulo"=>"A buen fin no hay mal tiempo", "terminado"=>1605},"31"=>{"titulo"=>"El rey Lear", "terminado"=>1606},"32"=>{"titulo"=>"Timón de Atenas", "terminado"=>1606},"33"=>{"titulo"=>"Macbeth", "terminado"=>1606},"34"=>{"titulo"=>"Antonio y Cleopatra", "terminado"=>1606},"35"=>{"titulo"=>"Pericles", "terminado"=>1608},"36"=>{"titulo"=>"Coriolano", "terminado"=>1608},"37"=>{"titulo"=>"Cuento de invierno", "terminado"=>1611},"38"=>{"titulo"=>"Cimbelino", "terminado"=>1610},"39"=>{"titulo"=>"La tempestad", "terminado"=>1611},"40"=>{"titulo"=>"Cardenio", "terminado"=>1613},"41"=>{"titulo"=>"Enrique VIII", "terminado"=>1613},"42"=>{"titulo"=>"Los dos nobles caballeros", "terminado"=>1614}}}; end; --- Hasta ahora hemos ejecutado programas que usan solamente cosas que hemos tecleado nosotros mismos. diff --git a/translations/es/try_ruby_500.md b/translations/es/try_ruby_500.md index 64d09fa8..b277d8ed 100644 --- a/translations/es/try_ruby_500.md +++ b/translations/es/try_ruby_500.md @@ -24,6 +24,6 @@ A la misma vez podemos limitar la longitud del contenido del BlurbTM end end - Blurb.new.tiempo + Blurb.new(:sick).tiempo (Ese parámetro __contenido=""__ está ahí para asegurarnos de que tenemos un string como contenido, aunque no le pasemos nada al método initialize). diff --git a/translations/ja/try_ruby_200.md b/translations/ja/try_ruby_200.md index 33aaccee..da474adb 100644 --- a/translations/ja/try_ruby_200.md +++ b/translations/ja/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: JA title: 構えて、狙って -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: オーケー。詩全体が逆順に変わりました。 error: diff --git a/translations/ja/try_ruby_220.md b/translations/ja/try_ruby_220.md index de4a72fc..e5987cb1 100644 --- a/translations/ja/try_ruby_220.md +++ b/translations/ja/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: JA title: メソッドをつなげる -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: いい感じですね!joinメソッドは、配列の各要素をつなげて、一つの文字列にしました。 error: diff --git a/translations/ja/try_ruby_280.md b/translations/ja/try_ruby_280.md index 462f646b..4a6cb4b6 100644 --- a/translations/ja/try_ruby_280.md +++ b/translations/ja/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: JA title: 辛辣な書評をつけてしまった? -answer: "mediocre" +answer: :mediocre load: books = {"Gravitys Rainbow" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre, "Bumblebees" => :mediocre} ok: やった!すごいです。評価のスコアカードを作成しました error: diff --git a/translations/ja/try_ruby_380.md b/translations/ja/try_ruby_380.md index f6afde89..779192dc 100644 --- a/translations/ja/try_ruby_380.md +++ b/translations/ja/try_ruby_380.md @@ -4,7 +4,7 @@ title: 世界はあなたの思いのまま answer: ^\{\"William ok: いいですね。けれど少しばかり読みにくいです。 error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- ここまでは、自分自身で入力したものだけを使用するプログラムを実行してきました。 diff --git a/translations/ja/try_ruby_500.md b/translations/ja/try_ruby_500.md index a75098a7..bf143ec7 100644 --- a/translations/ja/try_ruby_500.md +++ b/translations/ja/try_ruby_500.md @@ -25,7 +25,7 @@ __initialize__メソッドをクラスに追加しましょう。 end end - Blurb.new.time + Blurb.new(:sick).time (引数の__content=""__という部分は、内容が文字列であると確認するためにあります。 こう書くことで、たとえcontent部分の引数が与えられなったとしても空文字が渡されます。) diff --git a/translations/mk/try_ruby_200.md b/translations/mk/try_ruby_200.md index a8dca39b..e41c0d95 100644 --- a/translations/mk/try_ruby_200.md +++ b/translations/mk/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: MK title: Подготвен, нишани -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: Во ред. Целата поема е прикажана во обратен редослед. error: diff --git a/translations/mk/try_ruby_220.md b/translations/mk/try_ruby_220.md index 02f167a9..0033fadb 100644 --- a/translations/mk/try_ruby_220.md +++ b/translations/mk/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: MK title: Прстени од врзување на методи -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: Добра претстава, мој пријателе!
join методот ја зеде низата од редици стихови и ги спои сите заедно во стринг. error: diff --git a/translations/mk/try_ruby_280.md b/translations/mk/try_ruby_280.md index 8d371cad..7906da4d 100644 --- a/translations/mk/try_ruby_280.md +++ b/translations/mk/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: MK title: Дали си строг при оценувањето на книгите? -answer: "mediocre" +answer: :mediocre load: books = {"Gravitys Rainbow" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre, "Bumblebees" => :mediocre} ok: Одлично, браво! Ти само што направи карта со твои оцени. error: diff --git a/translations/mk/try_ruby_380.md b/translations/mk/try_ruby_380.md index c265e103..d163436f 100644 --- a/translations/mk/try_ruby_380.md +++ b/translations/mk/try_ruby_380.md @@ -4,7 +4,7 @@ title: Светот е нашата школка (Извадок од Шекс answer: ^\{\"William ok: Добро. Малку потешко за читање. error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- Сѐ до сега извршувавме програми кои користат работи што сами ги пишувавме. diff --git a/translations/mk/try_ruby_500.md b/translations/mk/try_ruby_500.md index 4b5d8f86..b7eef142 100644 --- a/translations/mk/try_ruby_500.md +++ b/translations/mk/try_ruby_500.md @@ -24,7 +24,7 @@ error: end end - Blurb.new.time + Blurb.new(:sick).time (Параметарот __content=""__ е тука за да нѐ потсетува дека содржината е од тип Стринг, иако параметер со содржина не е пуштен во initialize методот.) diff --git a/translations/nl/try_ruby_200.md b/translations/nl/try_ruby_200.md index 44b943e1..0025e1a5 100644 --- a/translations/nl/try_ruby_200.md +++ b/translations/nl/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: NL title: Ready, Aim -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: Lijkt wel Latijn error: diff --git a/translations/nl/try_ruby_220.md b/translations/nl/try_ruby_220.md index 8446b635..0a391c85 100644 --- a/translations/nl/try_ruby_220.md +++ b/translations/nl/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: NL title: De schakels van de ketting -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: Goed gedaan hoor!
De join methode heeft dat array weer aan elkaar geplakt. error: diff --git a/translations/nl/try_ruby_280.md b/translations/nl/try_ruby_280.md index f436b9ea..79d927bc 100644 --- a/translations/nl/try_ruby_280.md +++ b/translations/nl/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: NL title: Hoe streng ben jij? -answer: "matig" +answer: :matig load: boeken = {"De regenboog" => :uitstekend, "Het puffertje" => :vreselijk, "Kleurenblind" => :matig, "Bloemetjes en bijtjes" => :matig} ok: Wow! Je hebt een scorelijst gemaakt. error: diff --git a/translations/nl/try_ruby_380.md b/translations/nl/try_ruby_380.md index 91fc1a00..47e77da2 100644 --- a/translations/nl/try_ruby_380.md +++ b/translations/nl/try_ruby_380.md @@ -4,7 +4,7 @@ title: We kunnen de hele wereld aan answer: ^\{\"William ok: Goed. Wel lastig te lezen zo. error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- Tot op heden hebben we programma's uitgevoerd die we zelf hebben ingetypt. En dat is diff --git a/translations/nl/try_ruby_500.md b/translations/nl/try_ruby_500.md index 6d0b6aa6..b045df05 100644 --- a/translations/nl/try_ruby_500.md +++ b/translations/nl/try_ruby_500.md @@ -26,7 +26,7 @@ Dan kunnen we ook meteen instellen dat de maximale BlurbTM tekst leng end end - Blurb.new.tijd + Blurb.new(:sick).tijd (Parameter __tekst=""__ zorgt er voor dat we zeker weten dat _tekst_ een string is. Ook als _Blurb.new_ wordt aangeroepen zonder parameters.) diff --git a/translations/pt-br/try_ruby_200.md b/translations/pt-br/try_ruby_200.md index 1d34e0b5..326e45d5 100644 --- a/translations/pt-br/try_ruby_200.md +++ b/translations/pt-br/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: PT-BR title: Pronto, Mire -answer: ^\n.al-emoc (.+) +answer: oãm ahnim ad uoov adarrot ahniM load: prev ok: Ok, claro. Então todo o poema foi invertido. error: diff --git a/translations/pt-br/try_ruby_220.md b/translations/pt-br/try_ruby_220.md index 30be89a7..edf32471 100644 --- a/translations/pt-br/try_ruby_220.md +++ b/translations/pt-br/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: PT-BR title: Cachos de Métodos Encadeados -answer: ^Mais ainda eu quero (.+) +answer: Minha torrada voou da minha mão load: prev ok: Bem mostrado, meu amigo!
O método join pega este array de linhas e junta todas elas em uma string. error: diff --git a/translations/pt-br/try_ruby_280.md b/translations/pt-br/try_ruby_280.md index 26a5c538..1578807e 100644 --- a/translations/pt-br/try_ruby_280.md +++ b/translations/pt-br/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: PT-BR title: Você é Áspero (Harsh)? -answer: "mediocre" +answer: :mediocre load: livros = {"O Arco-Íris da Gravidade" => :esplendido, "Até o Fim" => :lixo, "Cores Vivas" => :mediocre, "Bumblebees" => :mediocre} ok: Ótimo, wow! Você fez um scorecard das suas análises. error: diff --git a/translations/pt-br/try_ruby_380.md b/translations/pt-br/try_ruby_380.md index c09b72aa..b7779415 100644 --- a/translations/pt-br/try_ruby_380.md +++ b/translations/pt-br/try_ruby_380.md @@ -4,7 +4,7 @@ title: O mundo é nossa ostra answer: ^\{\"William ok: Bom. Um pouco díficil de ler. error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- Até agora, rodamos apenas programas que utilizam apenas coisas digitadas por nós mesmos. diff --git a/translations/pt-br/try_ruby_500.md b/translations/pt-br/try_ruby_500.md index da60fc0d..1c1af0b2 100644 --- a/translations/pt-br/try_ruby_500.md +++ b/translations/pt-br/try_ruby_500.md @@ -24,7 +24,7 @@ Ao mesmo tempo, nós queremos limitar o tamanho do conteúdo do BLurbTMМетод join взял строки из этого массива и соединил их в строку. error: diff --git a/translations/ru/try_ruby_280.md b/translations/ru/try_ruby_280.md index e236b734..f188ed8f 100644 --- a/translations/ru/try_ruby_280.md +++ b/translations/ru/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: RU title: А ты суров? -answer: "mediocre" +answer: :mediocre load: books = {"Война и мир" => :splendid, "Отцы и дети" => :abysmal, "Идиот" => :mediocre, "Евгений Онегин" => :amazing} ok: Отлично, круто! Вы создали таблицу своих оценок --- diff --git a/translations/ru/try_ruby_380.md b/translations/ru/try_ruby_380.md index a5b65f88..8f2ba4ab 100644 --- a/translations/ru/try_ruby_380.md +++ b/translations/ru/try_ruby_380.md @@ -4,7 +4,7 @@ title: Мир - наша устрица answer: ^\{\"William ok: Хорошо, но читать тяжело! error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- До сих пор мы запускали программы, которые используют только те вещи, которые мы набрали сами. diff --git a/translations/ru/try_ruby_500.md b/translations/ru/try_ruby_500.md index 211799eb..872564cc 100644 --- a/translations/ru/try_ruby_500.md +++ b/translations/ru/try_ruby_500.md @@ -25,6 +25,6 @@ error: end end - Blurb.new.time + Blurb.new(:sick).time (Этот параметр __content=""__ используется, чтобы было известно, что это строка и никакой другой параметр не мог инициализировать его.) diff --git a/translations/ua/try_ruby_200.md b/translations/ua/try_ruby_200.md index 455a0194..0d6424cd 100644 --- a/translations/ua/try_ruby_200.md +++ b/translations/ua/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: UA title: Готовий, цілься! -answer: ^\nитсї'з її вітох (.+) +answer: кур з енем у алапив акпанак яоМ load: prev ok: Звісно, увесь віршик розвернутий задом наперед error: diff --git a/translations/ua/try_ruby_220.md b/translations/ua/try_ruby_220.md index a54d9008..7f442d9e 100644 --- a/translations/ua/try_ruby_220.md +++ b/translations/ua/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: UA title: Ще трохи методів в ланцюжок -answer: ^Тоді я найбільше (.+) +answer: Моя канапка випала у мене з рук load: prev ok: Прекрасно, друже!
Метод join взяв масив рядків і з'єднав їх в один рядок'. error: diff --git a/translations/ua/try_ruby_280.md b/translations/ua/try_ruby_280.md index 9808bb77..77dc4cec 100644 --- a/translations/ua/try_ruby_280.md +++ b/translations/ua/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: UA title: Ти суворий критик? -answer: "mediocre" +answer: :mediocre load: books = {"Фарбований Лис" => :splendid, "Сутінки. Сага." => :abysmal, "Хоббіт" => :mediocre, "Голодні ігри" => :mediocre} ok: Ти створив свій власний рейтинг книжок error: diff --git a/translations/ua/try_ruby_380.md b/translations/ua/try_ruby_380.md index d0390cb5..d728624a 100644 --- a/translations/ua/try_ruby_380.md +++ b/translations/ua/try_ruby_380.md @@ -4,7 +4,7 @@ title: Світ – наша мушля answer: ^\{\"William ok: Добре. Але важко читати. error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- Досі ти запускав програми, які використовують тільки те, що ти набирав сам. Це класно, але зараз епоха інтернету, а значить можна використовувати ці дані. diff --git a/translations/ua/try_ruby_500.md b/translations/ua/try_ruby_500.md index 85ff2713..421edbe7 100644 --- a/translations/ua/try_ruby_500.md +++ b/translations/ua/try_ruby_500.md @@ -25,6 +25,6 @@ error: end end - Blurb.new.time + Blurb.new(:sick).time (Цей параметр __content=""__ використовується, щоб нам було відомо, що контент це рядок і ніякий інший параметр не може ініціювати його.) diff --git a/translations/zh/try_ruby_200.md b/translations/zh/try_ruby_200.md index d6c10081..5cdb43e5 100644 --- a/translations/zh/try_ruby_200.md +++ b/translations/zh/try_ruby_200.md @@ -1,7 +1,7 @@ --- lang: ZH title: 摆好姿势,瞄准 -answer: ^\n.ti tae ot (.+) +answer: dnah ym morf nwolf sah tsaot yM load: prev ok: 好的,当然。所以整首诗被倒着写了。 error: diff --git a/translations/zh/try_ruby_220.md b/translations/zh/try_ruby_220.md index bcad6c70..ffee4df2 100644 --- a/translations/zh/try_ruby_220.md +++ b/translations/zh/try_ruby_220.md @@ -1,7 +1,7 @@ --- lang: ZH title: 链式方法的小环 -answer: ^More still did (.+) +answer: My toast has flown from my hand load: prev ok: 好样的,我的朋友!
join方法把那个数组的行数放在一起,变成一个字符串。 error: diff --git a/translations/zh/try_ruby_280.md b/translations/zh/try_ruby_280.md index eecc8bfa..47b39fec 100644 --- a/translations/zh/try_ruby_280.md +++ b/translations/zh/try_ruby_280.md @@ -1,7 +1,7 @@ --- lang: ZH title: 你标准很高? -answer: "mediocre" +answer: :mediocre load: books = {"Gravitys Rainbow" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre, "Bumblebees" => :mediocre} ok: 不错,你已经为你的书评做了一个评分卡了 error: diff --git a/translations/zh/try_ruby_380.md b/translations/zh/try_ruby_380.md index 5135039c..b87a0f44 100644 --- a/translations/zh/try_ruby_380.md +++ b/translations/zh/try_ruby_380.md @@ -4,7 +4,7 @@ title: 世界是我们的囊中之物 answer: ^\{\"William ok: 很好。有点难读。 error: -load: def get_shakey;JSON.parse("{\"William Shakespeare\": {\"1\": {\"title\": \"The Two Gentlemen of Verona\", \"finished\": 1591},\"2\": {\"title\": \"The Taming of the Shrew\", \"finished\": 1591},\"3\": {\"title\": \"Henry VI, Part 2\", \"finished\": 1591},\"4\": {\"title\": \"Henry VI, Part 3\", \"finished\": 1591},\"5\": {\"title\": \"Henry VI, Part 1\", \"finished\": 1592},\"6\": {\"title\": \"Titus Andronicus\", \"finished\": 1592},\"7\": {\"title\": \"Richard III\", \"finished\": 1593},\"8\": {\"title\": \"Edward III\", \"finished\": 1593},\"9\": {\"title\": \"The Comedy of Errors\", \"finished\": 1594},\"10\": {\"title\": \"Love's Labour's Lost\", \"finished\": 1595},\"11\": {\"title\": \"Love's Labour's Won\", \"finished\": 1596},\"12\": {\"title\": \"Richard II\", \"finished\": 1595},\"13\": {\"title\": \"Romeo and Juliet\", \"finished\": 1595},\"14\": {\"title\": \"A Midsummer Night's Dream\", \"finished\": 1595},\"15\": {\"title\": \"King John\", \"finished\": 1596},\"16\": {\"title\": \"The Merchant of Venice\", \"finished\": 1597},\"17\": {\"title\": \"Henry IV, Part 1\", \"finished\": 1597},\"18\": {\"title\": \"The Merry Wives of Windsor\", \"finished\": 1597},\"19\": {\"title\": \"Henry IV, Part 2\", \"finished\": 1598},\"20\": {\"title\": \"Much Ado About Nothing\", \"finished\": 1599},\"21\": {\"title\": \"Henry V\", \"finished\": 1599},\"22\": {\"title\": \"Julius Caesar\", \"finished\": 1599},\"23\": {\"title\": \"As You Like It\", \"finished\": 1600},\"24\": {\"title\": \"Hamlet\", \"finished\": 1601},\"25\": {\"title\": \"Twelfth Night\", \"finished\": 1601},\"26\": {\"title\": \"Troilus and Cressida\", \"finished\": 1602},\"27\": {\"title\": \"Sir Thomas More\", \"finished\": 1604},\"28\": {\"title\": \"Measure for Measure\", \"finished\": 1604},\"29\": {\"title\": \"Othello\", \"finished\": 1604},\"30\": {\"title\": \"All's Well That Ends Well\", \"finished\": 1605},\"31\": {\"title\": \"King Lear\", \"finished\": 1606},\"32\": {\"title\": \"Timon of Athens\", \"finished\": 1606},\"33\": {\"title\": \"Macbeth\", \"finished\": 1606},\"34\": {\"title\": \"Antony and Cleopatra\", \"finished\": 1606},\"35\": {\"title\": \"Pericles, Prince of Tyre\", \"finished\": 1608},\"36\": {\"title\": \"Coriolanus\", \"finished\": 1608},\"37\": {\"title\": \"The Winter's Tale\", \"finished\": 1611},\"38\": {\"title\": \"Cymbeline\", \"finished\": 1610},\"39\": {\"title\": \"The Tempest\", \"finished\": 1611},\"40\": {\"title\": \"Cardenio\", \"finished\": 1613},\"41\": {\"title\": \"Henry VIII\", \"finished\": 1613},\"42\": {\"title\": \"The Two Noble Kinsmen\", \"finished\": 1614}}}");end; +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; --- 目前我们只运行了我们输入的程序,这很棒,展示出来的信息是史诗级的,但如今是互联网纪元, diff --git a/translations/zh/try_ruby_500.md b/translations/zh/try_ruby_500.md index 7b4847f0..6ccc9396 100644 --- a/translations/zh/try_ruby_500.md +++ b/translations/zh/try_ruby_500.md @@ -25,7 +25,7 @@ error: end end - Blurb.new.time + Blurb.new(:sick).time (参数 __content=""__ 是为了确保即使没有content参数被传入初始化方法中, content也是字符串。)