如何在Ruby中跨类使用用户输入?
我正在编写一个应用程序,它可以从genius.com上向用户展示前十首歌曲。然后用户可以选择一首歌曲来查看歌词 我想知道如何在scraper类的方法中使用cli类中收集的用户输入 现在,我有一部分刮刀发生在刮刀课之外,但我希望明确划分责任 以下是我的部分代码:如何在Ruby中跨类使用用户输入?,ruby,class,api-design,gets,Ruby,Class,Api Design,Gets,我正在编写一个应用程序,它可以从genius.com上向用户展示前十首歌曲。然后用户可以选择一首歌曲来查看歌词 我想知道如何在scraper类的方法中使用cli类中收集的用户输入 现在,我有一部分刮刀发生在刮刀课之外,但我希望明确划分责任 以下是我的部分代码: Class CLI def get_user_song chosen_song = gets.strip.to_i if chosen_song > 10 || chosen_song < 1 puts &qu
Class CLI
def get_user_song
chosen_song = gets.strip.to_i
if chosen_song > 10 || chosen_song < 1
puts "Only the hits! Choose a number from 1-10."
end
Class CLI
def get_user_song
所选歌曲=get.strip.to\u i
如果选择歌曲>10 | |选择歌曲<1
放入“仅限点击次数!从1-10中选择一个数字。”
结束
我希望能够做如下的事情
Class Scraper
def self.scrape_lyrics
page = Nokogiri::HTML(open("https://genius.com/#top-songs"))
@url = page.css('div#top-songs a').map {|link| link['href']}
user_selection = #input_from_cli #<---this is where I'd like to use the output
# of the 'gets' method above.
@print_lyrics = @url[user_selection - 1]
scrape_2 = Nokogiri::HTML(open(@print_lyrics))
puts scrape_2.css(".lyrics").text
end
类刮刀
def self.scrape_歌词
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
@url=page.css('div#top songs a').map{{| link | link['href']}
user_selection=#input_from_cli#我看到了两种可能的解决方案。哪一个适合于此取决于您的设计目标。我将尝试对每个选项进行解释:
- 通过简单地阅读代码,用户输入数字时不会看到页面内容(通过程序)。在这种情况下,简单的方法是将选定的数字作为参数传递给
scrape_-lyrpriss
方法:
def self.scrape_歌词(用户选择)
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
@url=page.css('div#top songs a').map{{| link | link['href']}
@打印歌词=@url[用户选择-1]
scrape_2=Nokogiri::HTML(打开(@print_歌词))
放入scrape_2.css(“歌词”).text
结束
所有排序都在CLI类中进行,并且在启动时使用所有必要的数据调用scraper
- 当以更具交互性的方式想象你的工具时,我想让scraper下载当前的前10名并将列表呈现给用户以供选择可能会很有用。在这种情况下,交互作用是有点来回的。
如果仍然需要严格分离,可以将
scrape_歌词
分为scrape_top_ten
和scrape_歌词_by_number(song_number)
并在CLI类中对其排序。
如果您期望交互流是非常动态的,那么最好将交互方法注入到scraper中并反转依赖关系:
def self.scrape_歌词(cli)
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
titles=page.css('div#top songs h3:first child').map{t|t.text}
user_selection=cli.choose(titles)#向用户提供选择,并返回所选号码
@url=page.css('div#top songs a').map{{| link | link['href']}
@打印歌词=@url[用户选择-1]
scrape_2=Nokogiri::HTML(打开(@print_歌词))
放入scrape_2.css(“歌词”).text
结束
有关后一种方法的示例实现,请参见
我认为有两种可能的解决方案可以解决您的问题。哪一个适合于此取决于您的设计目标。我将尝试对每个选项进行解释:
- 通过简单地阅读代码,用户输入数字时不会看到页面内容(通过程序)。在这种情况下,简单的方法是将选定的数字作为参数传递给
scrape_-lyrpriss
方法:
def self.scrape_歌词(用户选择)
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
@url=page.css('div#top songs a').map{{| link | link['href']}
@打印歌词=@url[用户选择-1]
scrape_2=Nokogiri::HTML(打开(@print_歌词))
放入scrape_2.css(“歌词”).text
结束
所有排序都在CLI类中进行,并且在启动时使用所有必要的数据调用scraper
- 当以更具交互性的方式想象你的工具时,我想让scraper下载当前的前10名并将列表呈现给用户以供选择可能会很有用。在这种情况下,交互作用是有点来回的。
如果仍然需要严格分离,可以将
scrape_歌词
分为scrape_top_ten
和scrape_歌词_by_number(song_number)
并在CLI类中对其排序。
如果您期望交互流是非常动态的,那么最好将交互方法注入到scraper中并反转依赖关系:
def self.scrape_歌词(cli)
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
titles=page.css('div#top songs h3:first child').map{t|t.text}
user_selection=cli.choose(titles)#向用户提供选择,并返回所选号码
@url=page.css('div#top songs a').map{{| link | link['href']}
@打印歌词=@url[用户选择-1]
scrape_2=Nokogiri::HTML(打开(@print_歌词))
放入scrape_2.css(“歌词”).text
结束
有关后一种方法的示例实现,请参见
谢谢你,大卫!我走的是简单的路线。在cli中,我确实有一个方法,首先显示歌曲列表,然后单独搜索歌词。将用户选择作为一个参数输入效果非常好。我不太熟悉依赖注入,但我肯定会学习更多关于它以及tty提示宝石的知识。祝你旅途愉快,@arroyo23!谢谢你,大卫!我走的是简单的路线。在cli中,我确实有一个方法,首先显示歌曲列表,然后单独搜索歌词。将用户选择作为一个参数输入效果非常好。我不太熟悉依赖注入,但我肯定会学习更多关于它以及tty提示宝石的知识。祝你旅途愉快,@arroyo23!