> For the complete documentation index, see [llms.txt](https://certil-remy.gitbook.io/learn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://certil-remy.gitbook.io/learn/ruby/untitled-8.md).

# Method-scope-lab

## Objectives

1. Define a method that takes in an argument and pass a variable in as that argument.
2. Understand that a variable defined inside a method cannot be used outside of that method.

## Instructions

### Part I: Passing a Variable Into a Method

Open up `lib/catch_phrase.rb`. You should see the following method:

```
def catch_phrase
  puts phrase
end
```

Note that the method is trying to `puts` out a variable called `phrase`.

Let's take a look at the test for this method in `spec/catch_phrase_spec.rb`:

```
describe "#catch_phrase" do
  it "puts out a catch phrase" do
    phrase = "It's-a me, Mario!"
    expect{catch_phrase}.to output("It's-a me, Mario!\n").to_stdout
  end
end
```

Go ahead and run the test for this method only by typing `rspec spec/catch_phrase_spec.rb` into your terminal in the directory of this lab. You should see the following error:

```
NameError:
  undefined local variable or method `phrase' for #<RSpec::ExampleGroups::CatchPhrase:0x007f87b9cf04c0>
```

This error is occurring because the code inside the `#catch_phrase` method is trying to use the `phrase` variable **but** it's not present inside the *scope* of the `#catch_phrase` method. **It is out of scope.** Let's fix it!

We need to pass `phrase` into our `#catch_phrase` as an argument. Let's do it:

1. Re-define the `#catch_phrase` method to take in an argument of a phrase.
2. Change the test in `spec/catch_phrase_spec.rb` to match the following:

```
require "spec_helper"
describe "#catch_phrase" do
  it "puts out a catch phrase" do
    phrase = "It's-a me, Mario!"
    expect{catch_phrase(phrase)}.to output("It's-a me, Mario!\n").to_stdout
  end
end
```

### Part II: Understanding Method Scope

Open up `lib/rescue_princess_peach.rb` and take a look at the following method:

```
def rescue_princess_peach
  status = "rescued"
  puts "Hooray! Mario has rescued Princess Peach."
end
```

Notice that the body of this method is setting a variable, `status` equal to a value of `"rescued"`. Do you think we will be able to access this variable outside of the method? Let's find out!

1 . Un-comment the following lines in your `lib/rescue_princess_peach.rb` file:

```
rescue_princess_peach
puts status
```

2 . Run the file with `ruby lib/rescue_princess_peach.rb` in your terminal. You should see the following:

```
Hooray! Mario has rescued Princess Peach.
lib/rescue_princess_peach.rb:12:in `<main>': undefined local variable or method `status' for main:Object (NameError)
```

We are getting a `NameError` because `status` is undefined. Wait a minute, you might be wondering. Didn't we define `status` inside the `#rescue_princess_peach` method? We did, but **variables defined inside a method are not available outside of that method**. They are only available within the `scope` of that method.

**Go back and comment out lines 11 and 12 of `rescue_princess_peach.rb`.**

Run the test suite and you'll see that we are passing all of our tests. If you open up the `spec/rescue_princess_peach_spec.rb` file, you'll see the following test:

```
require "spec_helper"

describe "#rescue_princess_peach" do
  it "outputs a message and sets a variable, status, that is not available outside of this method" do
    expect{rescue_princess_peach}.to output("Hooray! Mario has rescued Princess Peach.\n").to_stdout
    expect{puts status}.to raise_error(NameError)
  end
end
```

Notice the last expectation of our test: `expect{puts status}.to raise_error(NameError)`. We expect any attempt to use the `status` variable to be met with a `NameError`. Our program, outside of the `#rescue_princess_peach`method, just doesn't know what it is.

View [Method Scope Lab](https://github.com/learn-co-curriculum/method-scope-lab) on Learn.co and start learning to code for free.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://certil-remy.gitbook.io/learn/ruby/untitled-8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
