2016-02-17 121 views
0

我想知道爲什麼下面的代碼不打印超過3顆星的電影。這個例子爲什麼不用ruby代碼打印結果?

movie_ratings = { 
    memento: 3, 
    primer: 3.5, 
    the_matrix: 5, 
    truman_show: 4, 
    red_dawn: 1.5, 
    skyfall: 4, 
    alex_cross: 2, 
    uhf: 1, 
    lion_king: 3.5 
} 

def good_movies 
    puts movie_ratings.select {|movies, ratings| ratings > 3} 
end 
good_movies 
+2

當我試圖運行時它根本沒有運行它(因爲在用def創建的方法中,你看不到局部變量,比如在外部創建的movie_ratings) –

+0

@FrederickCheung:我想這就是問題所在。 –

回答

1

局部變量movie_ratings不在方法good_movies訪問。有幾種方法可在這裏:

  1. 通評級作爲參數

    movie_ratings = { 
        memento: 3, 
        primer: 3.5, 
        the_matrix: 5, 
        truman_show: 4, 
        red_dawn: 1.5, 
        skyfall: 4, 
        alex_cross: 2, 
        uhf: 1, 
        lion_king: 3.5 
    } 
    
    def good_movies(ratings) 
        puts ratings.select {|movies, ratings| ratings > 3} 
    end 
    
    good_movies(movie_ratings) 
    
  2. 讓收視率實例變量(而不是局部變量)

    @movie_ratings = { 
        memento: 3, 
        primer: 3.5, 
        the_matrix: 5, 
        truman_show: 4, 
        red_dawn: 1.5, 
        skyfall: 4, 
        alex_cross: 2, 
        uhf: 1, 
        lion_king: 3.5 
    } 
    
    def good_movies 
        puts @movie_ratings.select {|movies, ratings| ratings > 3} 
    end 
    
    good_movies 
    
1

變量movie_ratings不在該方法的範圍內。您應該將其作爲參數傳遞給它:

movie_ratings = { 
    memento: 3, 
    primer: 3.5, 
    the_matrix: 5, 
    truman_show: 4, 
    red_dawn: 1.5, 
    skyfall: 4, 
    alex_cross: 2, 
    uhf: 1, 
    lion_king: 3.5 
} 

def good_movies movie_ratings 
    puts movie_ratings.select {|movies, ratings| ratings > 3} 
end 
good_movies movie_ratings 
# {:primer=>3.5, :the_matrix=>5, :truman_show=>4, :skyfall=>4, :lion_king=>3.5} 
1

因爲局部變量不能將範圍傳入方法塊。將其更改爲另一種類型的變量,例如一個實例變量,它將起作用。

@movie_ratings = { 
    memento: 3, 
    primer: 3.5, 
    the_matrix: 5, 
    truman_show: 4, 
    red_dawn: 1.5, 
    skyfall: 4, 
    alex_cross: 2, 
    uhf: 1, 
    lion_king: 3.5 
} 

def good_movies 
    puts @movie_ratings.select {|movies, ratings| ratings > 3} 
end 
good_movies 
0

如果你得到以下錯誤:

NameError: undefined local variable or method `movie_ratings' for main:Object 

原因是方法good_movies創建它自己的本地範圍,它不明白什麼movie_ratings是。您需要將它傳遞給該方法,以便該方法能夠理解它是什麼。

def good_movies(movies) 
    return movies.select { |m, r| r > 3 } 
end 
+0

這裏不需要'return'。 –

1

您應該通過movie_ratings的方法good_movies這樣的:

def good_movies(movie_ratings) 
    puts movie_ratings.select {|movies, ratings| ratings > 3} 
end 

或使movie_ratings這樣一個實例變量:

@movie_ratings 

,然後該方法使用內:puts @movie_ratings.select {|movies, ratings| ratings > 3}

相關問題