如何在ruby中实现java中抽象类实现接口

如何快速学习 Ruby on Rails? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="5,216分享邀请回答62930 条评论分享收藏感谢收起17910 条评论分享收藏感谢收起下次自动登录
现在的位置:
& 综合 & 正文
Ruby学习笔记之面向对象
【上篇】【下篇】博客分类:
通过Rubygems的插件,定制自己的RubyGems命令
或者,你也想了解
&&&& 最近RubyGems的1.3.2的版本,发布了一个热点功能,支持自己定制的Gems命令。本文将就一个例子,说明如何使用Rubygems的插件,生成自己的Gems命令。
&&&& 下面是创建Gems定制命令的主要步骤:
&& 1. 创建 rubygems_plugin.rb
&& 2. 注册你的命令
&& 3. 生成命令文件
&& 4. 定制命令描述
步骤 1: 创建 rubygems_plugin.rb
&&& 在现有的gem包源文件,或者新建的gem源文件目录下创建lib/rubygems_plugin.rb。可以参考graph的命令生成。
步骤 2: 注册你的命令
&&& 在你创建的rubygems_plugin.rb文件中,你要注册你的命令,还需要加载:
require Gem::CommandManager
实际的rubygems_plugin.rb文件可能如下:
require 'rubygems/command_manager'
# dependencies specific to my command
require 'rubygems/commands/query_command'
require 'rubygems/super_search'
require 'hirb'
Gem::CommandManager.instance.register_command :grep
步骤3. 生成命令文件
&&& 为了让RubyGems自动的加载你的命令,你需要把你的命令文件放到lib/rubygems/commands/文件目录下。并且要依照Camel Case的命名方式,映射你的命令文件名。例如,对于上面的Gem::Commands::GrepCommand命令,则需要创建如下文件lib/rubygems/commands/grep_command.rb。 当然,如果,你不愿意分开文件,你也可以把你的命令代码写到rubygems_plugin.rb里。
步骤4. 定制命令描述
&&&& 下面举例说明命令定制如何写,比如,我们希望生成如下命令: new, execute, arguments, defaults_str, description and usage.
&&&&& 在这个命令对应的描述类中,我们需要定义命令的名称,提示和参数选项,具体命令可以如下:
class Gem::Commands::GrepCommand & Gem::Commands::QueryCommand
def initialize
super 'grep', "Enhances search command by providing extra search options and displaying results as a table"
defaults.merge!(:columns=&[:name,:summary,:author])
add_option('-c', '--columns STRING', 'Gemspec columns/attributes to display per gem') do |value, options|
options[:columns] = value.split(/\s*,\s*/).map {|e|
self.class.valid_gemspec_columns.detect {|c| c =~ /^#{e}/ }
}.compact.map {|e| e.to_sym}
add_option('-f', '--fields STRING', 'Gemspec fields/attributes to search (only for local gems)') do |value, options|
options[:fields] = value.split(/\s*,\s*/).map {|e|
self.class.valid_gemspec_columns.detect {|c| c =~ /^#{e}/ }
remove_option '--name-matches'
remove_option '-d'
remove_option '--versions'
&&& * 通常情况下我们创建命令多是Gem::Command的子类。例子中继承Gem::Commands::QueryCommand是因为,这个方法本身是query类型。
&&& * 使用super()来定义命令名称,提示信息和默认参数。但这个例子由于没有使用默认的父类所以,需要自己定制这些信息。
&&& * add_option 和 remove_option 用来添加和删除命令参数。它们用OptionParser定义参数。
&&&& 命令的功能部分通常在这里完成,但在这个例子中execute()并没有太多的逻辑,因为通过delegates在别的地方声明了。
def execute
string = get_one_optional_argument
options[:name] = /#{string}/i
Gem.source_index.extend Gem::SuperSearch
arguments(), defaults_str(), description() and usage()
&&& 这些部分是可选的,用来描述命令的help等信息。下面是针对说明:
&&& * arguments(): 命令参数
&&& * defaults_str(): 用来指定默认参数.
&&& * description: 用来指定命令的详细说明
&&& * usage(): 描述命令的顺序.
def arguments # :nodoc:
regular expression string to search specified gemspec attributes"
def usage # :nodoc:
"#{program_name} [REGEXP]"
def defaults_str # :nodoc:
"--local --columns name,summary,author --fields name --no-installed"
def description # :nodoc:
'Enhances search command by providing options to search (--fields) and display (--columns) ' +
'gemspec attributes. Results are displayed in an ascii table. Gemspec attributes can be specified '+
'by the first unique string that it starts with i.e. "su" for "summary". To specify multiple gemspec attributes, delimit ' +
"them with commas. Gemspec attributes available to options are: #{self.class.valid_gemspec_columns.join(', ')}."
浏览: 1675551 次
user模型里加上
def email ...
shrekting 写道var pattern = /^(0| ...
好文章!!!
link_to其实就是个a标签,使用css控制,添加一个参数: ...
完全看不懂,不知所然.能表达清楚一点?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Rails 中的抽象类 (abstract_class) 到底是什么意思? · Ruby China
发现每个Rails项目中默认都有这么一句:self.abstract_class = true,这貌似是?
# app/models/application_record.rb
class ApplicationRecord & ActiveRecord::Base
self.abstract_class = true
搜了一下,有用的信息不多:
“子类继承的时候不能继承父类的隐式属性”“只对你自己的程序起作用,从而不会污染其他插件”"setting self.abstract_class = true meant that your model did not have a table backing it."
新手看得迷迷糊糊,求解:
self.abstract_class = true这句是什么意思?为什么要把self.abstract_class设置为true?可以举个例子吗;
是不是设置了这个抽象类我就可以创建一个数据库里没有这个表的AR model了?如果是的话,那这样做有什么意义?AR不就是要把对象映射到数据库中对应的表吗,所以又回到了第一个问题。
当你有几个子类要继承同一个父类,但是并不是STI的时候,在父类声明abstract_class,在子类声明各自的table_name
ApplicationRecord就是个abstract class,他是ActiveRecord::Base和你的实际model中间的一层,使你对ApplicationRecord的扩展不会影响ActiveRecord::Base。而要做到这个,常规情况你需要有个名为application_records的表。
什么是STI?
STI = Single Table Inheritance 单表继承
后方可回复, 如果你还没有账号请点击这里 。
共收到 5 条回复Ruby类变量和类方法 - tim_sheng - 博客园
随笔 - 77, 文章 - 1, 评论 - 16, 引用 - 0
类变量被类的所有对象所共享,它与类方法相关联,对一个给定的类来说,类变量只存在一份拷贝。类变量由两个@符开头,例如@@count。与全局变量和实例变量不同,类变量在使用之前必须被初始化。通常,初始化就是在类定义中的简单赋值。
例如,我们的点唱机可能希望记录每首歌被播放的次数。这个数目可能是Song对象的一个实例变量。当一首歌被播放时,实例中的值增加。但是,假如我们还想要了解下一共播放了多少首歌。通过搜索所有Song对象并累加它们的播放次数,或者冒天下之大不韪使用全局变量来完成统计;或者,让我们使用类变量。
class Song
& @@plays = 0
& def initialize(name.artist,duration)
&&&& @name = name
&&&& @artlist = artist
&&&& @duration = duration
&&&& @plays = 0
& def play
&&&& @plays += 1&&&&& #same as @plays = @plays +1
&&&& @@plays += 1
&&&& "This song:#@plays plays.Total #@@plays plays."
出于调试的目的,我们还让Song#play 返回一个字符串,其中包括该歌曲被播放的次数,以及所有歌曲播放的总次数。我们可以很容易测试它。
s1 = Song.new("Song1","Artist1",234)& #test songss2 = Song.new("Song2","Artist2",345)s1.play&&&&&&&&&&&&&&&&&&&&&& -&"This song:1 plays.Total 1 plays."s2.play&&&&&&&&&&&&&&&&&&&&&& -&"This song:1 plays.Total 2 plays."s1.play&&&&&&&&&&&&&&&&&&&&&& -&"This song:2 plays.Total 3 plays."s1.play&&&&&&&&&&&&&&&&&&&&&& -&"This song:3 plays.Total 4 plays."
类变量对类及其实例都是私有的。如果你想让它们能够被外部世界访问,你需要编写访问方法。这个方法要么是一个实例方法,或者是类方法。
有时,类需要提供不束缚于任何特定对象的方法。我们已经见过一个这样的方法。new方法创建一个新的Song对象,但是new方法本身并不与一个特定的歌曲对象相关联。
song = Song.new(...)
我们会发现类方法遍布于Ruby库中。例如,File类的对象用来表示在底层文件系统中打开的一个文件。不过,File类还提供了几个类方法来操作文件,而它们并未打开文件,因此也没有相应的File对象。如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。
File.delete("dommed.txt")
类方法和实例方法是通过它们的定义区别开来的;通过在方法名之前放置类名以及一个句点,来定义类方法
class Example
&& def instance_method&&&&&&&&&&&&&&& #instance method
&& def Example.class_method&&&&&&& #class method

我要回帖

更多关于 实现抽象类 的文章

 

随机推荐