2016-02-17 90 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}

相关问题