Ruby知识积累1
2014-07-07 07:41
316 查看
书写风格:
类:
平板型参数:
CASE语句:
Ruby中的FALSE:nil
""--------->true
0 --------->true
[]--------->true
Ruby中赋值便捷方法:
ActiveSupport:
对数组的扩展:
对Date的扩展:
对Hash的扩展:
对Integer的扩展:
inflector:
命名空间:
MIXIN:
HOOKS:(self.include)
Blocks:
Yield:
Enumerable:
Bad: if ! tweets.empty? puts "Timeline:" puts tweets end Good: unless tweets.empty? puts "Timeline:" puts tweets end Bad: unless tweets.emtpy? puts "Timeline:" puts tweets else puts "No tweets found - better follow some people." end Good: if tweets.empty? puts "Timeline:" puts tweets else puts "No tweets found - better follow some people." end Bad: if attachment.file_path != nil attachment.post end Good: if attachment.file_path attachment.post end Bad: if password.length < 8 fail "Password too short" end unless username fail "No user name set." end Good: fail "Password too short" if password.length < 8 fail "No user name set." unless username Bad: if user if user.signed_in? ... end end Good: if user && user.signed_in? ... end Bad: if list_name options[:path] = "/#{user_name}/#{list_name}" else options[:path] = "/#{user_name}" end Good: options[:path] = if list_name "/#{user_name}/#{list_name}" else "/#{user_name}" end Bad: def list_url(user_name, list_name) if list_name url = "https://twitter.com//#{user_name}/#{list_name}" else url = "https://twitter.com//#{user_name}" end url end Good: def list_url(user_name, list_name) if list_name "https://twitter.com//#{user_name}/#{list_name}" else "https://twitter.com//#{user_name}" end end Bad:(对于可选参数) def tweet(message, lat, long) #... end tweet("Practicing Ruby-Fu!", nil, nil) Good: def tweet(message, lat=nil, long=nil) #... end tweet("Practicing Ruby-Fu!") Bad:(Hash参数) def tweet(message, lat=nil, long=nil, reply_id=nil) #... end tweet("Practicing Ruby-Fu!", nil, nil, 227946) Good: def tweet(message, options={}) status = Status.new status.lat = options[:lat] status.long = options[:long] status.body = message status.reply_id = options[:reply_id] end tweet("Practicing Ruby-Fu!", :lat => 28.55, :long => -81.33, :reply_id => 227946) Ruby>1.9 tweet("Practicing Ruby-Fu!", lat: 28.55, long: -81.33, reply_id: 227946) Bad:(异常) def get_tweets(list) if list.authorized?(@user) list.tweets else [] end end tweets = get_tweets(my_list) if tweets.empty? alert "No tweets were found!" + "Are you authorized to access this list?" end Good: def get_tweets(list) unless list.authorized?(@user) raise AuthorizationException.new end list.tweets end begin tweets = get_tweets(my_list) rescue AuthorizationException warn "You are not auhorized to access this list." end Bad:(类) user_names = [["Ashton", "Kutcher"],["Wil", "Wheaton"],["Madonna"]] user_names.each { |n| puts "#{n[1]},#{n[0]}" } Good: class Name def initialize(first, last = nil) @first = first @last = last end def format [@last, @first].compact.join(', ') end end user_names = [] user_names << Name.new("Ashton", "Kutcher") user_names << Name.new("Wil", "Wheaton") user_names << Name.new("Madonna") user_names.each{ |n| puts n.format } Bad:(勿过度开放属性权限) class Tweet attr_accessor :status, :created_at def initialize(status) @status = status @created_at = Time.now end end Good: class Tweet attr_accessor :status attr_reader :created_at def initialize(status) @status = status @created_at = Time.now end end Bad:(累的继承) class Image attr_accessor :title, :size, :url def to_s "#{@title}, #{@size}" end end class Video attr_accessor :title, :size, :url def to_s "#{@title}, #{@size}" end end Good: class Attachment attr_accessor :title, :size, :url def to_s "#{@title}, #{@size}" end end class Image < Attachment end class Video < Attachment end Bad: class User def tweet_header [@first_name, @last_name].join(' ') end def profile [@first_name, @last_name].join(' ') + @description end end Good: class User def display_name title = case @gender when :female then married? ? "Mrs." : "Miss" when :male then "Mr." end [title, @first_name, @last_name].join(' ') end def tweet_header display_name end def profile display_name + @description end end
类:
class UserList attr_accessor :name def initialize(name) self.name = name end end list = UserList.new('Andy') list.name----------->Andy
平板型参数:
def metion(status, *names) tweet("#{names.join(',')} #{status}") end metion('Your courses rocked!', 'eallam', 'greggpollack','jasonvanlue')
CASE语句:
client_url = case client_name when "web" "http://twitter.com" else nil end popularity = case tweet.retweet_count when 0..9 nil else "hot" end tweet_type = case tweet.status when /\A@\w+/ :mention when /\Ad\s+\w+/ :direct_message else :public end tweet_type = case tweet.status when /\A@\w+/ then :mention when /\Ad\s+\w+/ then :direct_message else :public end
Ruby中的FALSE:nil
""--------->true
0 --------->true
[]--------->true
Ruby中赋值便捷方法:
当result为nil时,赋值1 result ||= 1 若express1 || express2中,express1为False时,采用express2的值。 result = nil || 1 ......> 1 result = 1 || nil ......> 1 result = 1 || 2 ......> 1 def sign_in current_ssession || sign_uer_in end
ActiveSupport:
gem install activesupport gem install i18n require 'active_support/all'
对数组的扩展:
array = [0,1,2,3,4,5,6] array.from(4) array.to(2) 添加nil元素补齐: array.in_groups_of(3)---->[[0,1,2],[3,4,5],[6,nil,nil]] 以分隔元素为轴划分,并将分隔元素删除: array.split(2)---->[[0,1],[3,4,5,6]]
对Date的扩展:
apocalypse = DateTime.new(2014,7,6,12,49,30) apocalypse.at_beginning_of_day apocalypse.at_end_of_month apocalypse.at_beginning_of_year apocalypse.advance(years: 4, months: 3, weeks: 2, days: 1) apocalypse.tomorrow apocalypse.yesterday
对Hash的扩展:
options = {user: 'codeschool', lang: 'fr'} new_options = {user: 'codeschool', lang: 'fr', password: 'dunno'} options.diff(new_options) 将键值转换成字符串: options.stringify_keys 合并Hash,以options为主: options.reverse_merge(new_options) new_options.except(:password) new_options.assert_valid_keys(:user, :lang)
对Integer的扩展:
def background_class(index) return 'white' if index.odd? return 'grey' if index.even? end tweets.each_with_index do |tweet, index| puts "<div class='#{background_class(index)}'>#{tweet}</div>" end
inflector:
1.ordinalize "user".pluralize "users".singularize "ruby".titleize "account_options".humanize
命名空间:
Bad:(污染了全局方法,可能会和同名方法冲突。) image_utils.rb def preview(image) end def transfer(image, destination) 4000 end run.rb require 'image_utils' image = user.image preview(image) Good: image_utils.rb module ImageUtils def self.preview(image) end def self.transfer(image, destination) end end run.rb require 'image_utils' image = user.image ImageUtils.preview(image)
MIXIN:
module ImageUtils def preview end def transfer(destination) end end require 'image_utils' class Image include ImageUtils end image = user.image image.preview(image)
HOOKS:(self.include)
未用self.include: 模块: module ImageUtils def preview end def transfer(destination) end module ClassMethods def fetch_from_twitter(user) end end end 类: class Image include ImageUtils extend ImageUtils::ClassMethods end 调用: image = user.image image.preview Image.fetch_from_twitter('grege') 使用self.include: 模块: module ImageUtils def self.included(base) base.extend(ClassMethods) end def preview end def transfer(destination) end module ClassMethods def fetch_from_twitter(user) end end end 类: class Image include ImageUtils end 调用: image = user.image image.preview Image.fetch_from_twitter('grege') 使用activesupport gem: 模块: require 'active_support/concern' module ImageUtils extend ActiveSupport::Concern included do clean_up end def preview end def transfer(destination) end module ClassMethods def fetch_from_twitter(user) end def clean_up end end end 类: class Image include ImageUtils end
Blocks:
e.g. words = ['Had','eggs','for'] for index in 0..(words.length-1) puts words[index] end words.each { |word| puts word } or words.each do |word| puts word end
Yield:
e.g. def call_this_block yield "tweet" end call_this_block { |arg| puts arg.upcase } #---->TWEET e.g. def call_this_block block_result = yield "foo" puts block_result end call_this_block { |arg| puts arg.reverse } #---->OOF e.g. def puts_this_block puts yield end puts_this_block { "tweet" } #---->tweet e.g. Bad: class Timeline def list_tweeks @user.friends.each do |friend| friend.tweets.each { |tweet| puts tweet } end end def store_tweeks @user.friends.each do |friend| friend.tweets.each { |tweet| tweet.cache } end end end Good: class Timeline def each @user.friends.each do |friend| friend.tweets.each { |tweet| yield tweet } end end end timeline = Timeline.new(user) timeline.each { |tweet| puts tweet } timeline.each { |tweet| tweet.cache } e.g. Bad: def update_status(user, tweet) begin sign_in(user) post(tweet) rescue ConnectionError => e logger.error(e) ensure sign_out(user) end end def get_list(user, list_name) begin sign_in(user) retrieve_list(list_name) rescue ConnectionError => e logger.error(e) ensure sign_out(user) end end Good: def while_signed_in_as(user) sign_in(user) yield rescue ConnectionError => e logger.error(e) ensure sign_out(user) end while_signed_in_as(user) do post(tweet) end tweets = while_signed_in_as(user) do retrieve_list(list_name) end
Enumerable:
class Timeline def each #... end include Enumerable end timeline.sort_by { |tweet| tweet.created_at } timeline.map { |tweet| tweet.status } timeline.find_all { |tweet| tweet.status =~ /\@csdn/ }
相关文章推荐
- Ruby知识积累2
- Ruby语言知识积累
- Flex之旅:第一部分:flex必备基础知识积累(10)---弹出窗口以及位置控制
- Canvas基础知识积累
- 项目零散知识积累(三)
- Intergraph G/Technology平台上的一些知识积累
- Linux知识积累(2)dirname的使用方法
- [知识积累]不变矩理论 -具有光照和模糊不变性的矩
- android开发中积累的小知识(转)
- SQL 细节知识积累
- 【知识积累】数据库访问方式
- 在数据库里面建立自己的帮助文档(将自己积累和学到的新知识积累)
- 项目管理知识积累
- 常用前端知识积累
- angular框架知识积累
- 前台知识积累
- CC2541 BLE源码阅读知识积累之外设从机Peripheral工作模式
- Application Center Test知识点滴积累
- 中文知识积累