我想知道为什么下面的代码不打印超过 3 颗星的电影。
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
局部变量
movie_ratings
在方法good_movies
中不可访问。这里有几种方法:
将评级作为参数传递
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)
制作评级实例变量(而不是局部变量)
@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
变量
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}
因为局部变量不能将作用域纳入方法块中。将其更改为其他类型的变量,例如实例变量,它将起作用。
@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
您应该将
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}
如果您收到以下错误:
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
正如之前提到的,您必须将 movie_ ratings 作为参数传递给方法或使其成为实例变量。
但还有第三种选择:将 movie_ ratings 设置为常量变量。只需将第一个字母大写(或整个名称,根据需要)。然后该变量将可以通过 good_movies 方法访问。
您需要了解的有关其工作原理的所有信息:https://www.rubyguides.com/2017/07/ruby-constants/
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