rack和actionpack的map对比

简单的rackup配置

infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}
use Rack::CommonLogger
use Rack::ShowExceptions

map '/' do
run infinity
end

map '/version' do
map '/' do
run Proc.new {|env| [200, {"Content-Type" => "text/html"}, "infinity 0.1"] }
end

map '/last' do
run Proc.new {|env| [200, {"Content-Type" => "text/html"}, Rack::Request.new(env).params.inspect] }
end
end

执行先安装rack gem install rack
使用 rackup -R infinity.ru -p 3000

其中map的写法和routes.rb中做法差不多,回顾一下routes.rb中的写法。

ActionController::Routing::Routes.draw do |map|
map.connect ':controller/:action/:id'
end

routes.rb里面发生了什么呢?很不幸、里面过程错综复杂,横跨了至少四个类Builder,Mapper,Route,RouteSet,我只能告诉你结果,一句map.connect生成了一个Route对象。

rack代码则简单的我可以轻易的讨论。

module Rack
...

class Builder
def initialize(&block)
@ins = []
instance_eval(&block) if block_given?
end

...
def map(path, &block)
if @ins.last.kind_of? Hash
@ins.last[path] = self.class.new(&block).to_app
else
@ins << {}
map(path, &block)
end
end

def to_app
@ins[-1] = Rack::URLMap.new(@ins.last) if Hash === @ins.last
inner_app = @ins.last
@ins[0...-1].reverse.inject(inner_app) { |a, e| e.call(a) }
end
...

end
end

module Rack
...

class URLMap
def initialize(map)
@mapping = map.map { |location, app|
if location =~ %r{\Ahttps?://(.*?)(/.*)}
host, location = $1, $2
else
host = nil
end

unless location[0] == ?/
raise ArgumentError, "paths need to start with /"
end
location = location.chomp('/')

[host, location, app]
}.sort_by { |(h, l, a)| [-l.size, h.to_s.size] } # Longest path first
end

...
end
end



注意[0...-1]是不包含-1这个元素的,所以to_app只执行了前两句。map最终生成了一个url和Rack::URLMap对象的Hash。而在rails当中,url被切割成了多个segments。Rails这样作也自有其用处,常见的redirect_to :action => 'action'就是这样构造出url的,但是对于轻量级应用,就有一点大炮打蚊子了。
03-29
### 关于ROS中MOL的使用教程及相关资料 在ROS生态系统中,“MOL”可能指代多种含义,具体取决于上下文。以下是关于ROS中涉及“MOL”的一些常见解释及其相关内容: #### 1. **ROS中的MOL作为线粒体活性氧(Reactive Oxygen Species, ROS)的研究** 如果这里的“MOL”指的是与生物化学领域相关的研究,特别是线粒体内产生的活性氧物种,则可以参考以下内容: 活性氧(ROS)主要在线粒体中产生[^2]。这些分子不仅参与正常的细胞代谢过程,还受到生长因子、细胞因子以及外部环境因素的影响而发生变化。对于机器人操作系统(ROS),虽然其核心功能并不直接处理生物学数据,但在某些跨学科项目中,可能会通过传感器或其他设备监测与ROS相关的参数。 #### 示例代码片段 假设有一个节点用于模拟或记录某种形式的数据流(例如来自实验装置的压力读数或者温度变化情况),则可以通过创建自定义消息类型实现这一目标。 ```bash $ mkdir -p ~/catkin_ws/src/my_mol_package/msg/ ``` 接下来,在`msg/MyMessage.msg`文件中定义新的字段结构: ```plaintext float64 pressure_value int8 status_code string timestamp ``` --- #### 2. **基于SLAM_BOT项目的实践指南** 对于希望了解如何运行实际案例的学生而言,可以从开源仓库入手学习更多细节。例如,GitHub上的`sam_bot`提供了完整的导航堆栈配置示例[^3]。 要启动该项目,请遵循以下步骤操作说明文档内的指示完成编译流程后再尝试调用相应服务接口测试效果如何表现良好与否等问题解答如下所示: ```bash git clone https://github.com/Xiangyu-Fu/slam_bot.git /home/mol/study/ros_learn/catkin_ws/src/ cd ~/catkin_ws && catkin_make clean; time catkin_make --use-ninja; source ./devel/setup.sh ; roslaunch slam_bot bringup.launch map_file:=<path_to_map> ``` 上述脚本会自动加载指定的地图资源到内存当中以便后续路径规划算法能够顺利工作起来. --- #### 3. **验证安装状态的方法** 当遇到无法识别命令错误提示时(比如缺少依赖包),应该先确认当前环境中已经正确设置了必要的变量链接关系之后再继续往下排查原因所在之处[^4]: ```bash sudo apt update && sudo apt upgrade -y curl http://packages.ros.org/ros.key | sudo apt-key add - sh -c 'echo "deb [arch=amd64] http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-get install ros-noetic-desktop-full python-catkin-tools build-essential cmake pkg-config libopencv-dev qtbase5-dev qtmultimedia5-dev protobuf-compiler autoconf automake libtool flex bison g++ gcc make unzip wget doxygen graphviz imagemagick ghostscript pdftk texlive-latex-base latexmk dvipng lmodern ttf-dejavu-core fonts-liberation libreoffice-common unoconv pandoc asciidoctor rubygems-integration gem rake bundler jekyll kramdown rouge pygments.rb redcarpet github-markdown cssminify uglifier html-pipeline nokogiri sanitize addressable faraday octokit typhoeus excon net-http-persistent rest-client mime-types json jwt multi_json oauth2 omniauth omniauth-oauth2 rack-test rspec rails-controller-testing shoulda-matchers simplecov capybara selenium-webdriver webmock vcr factory_bot_rails faker database_cleaner guard-minitest spring pry-byebug binding_of_caller better_errors quiet_assets rubocop reek flog flay brakeman scss_lint haml_lint slim_linter coffee_script_erb_handler tilt erubis execjs therubyracer rb-readline ffi yajl-ruby curb mechanize nokogirix xpath loofah mail actionmailer actionpack activemodel activejob activesupport railties sprockets-rails sass-rails jquery-rails turbolinks jbuilder bootstrap-sass font-awesome-sass devise cancancan puma sidekiq redis delayed_job_active_record whenever figaro dotenv-rails letter_opener aws-sdk-v1 aws-sdk-kms aws-sdk-ses aws-sdk-sns aws-sdk-sqs aws-sdk-dynamodb aws-sdk-cloudwatch_logs aws-sdk-cloudformation aws-sdk-codedeploy aws-sdk-codepipeline aws-sdk-cognitoidentityprovider aws-sdk-comprehend aws-sdk-costexplorer aws-sdk-datapipeline aws-sdk-devicefarm aws-sdk-directconnect aws-sdk-directoryservice aws-sdk-dlm aws-sdk-ds aws-sdk-dynamodbstreams aws-sdk-ebs aws-sdk-ec2-instance-connect aws-sdk-ecs aws-sdk-efs aws-sdk-eks aws-sdk-elasticache aws-sdk-elasticsearch-service aws-sdk-emr-containers aws-sdk-eventbridge aws-sdk-finspace-data aws-sdk-firehose aws-sdk-glacier aws-sdk-greengrassv2 aws-sdk-healthlake aws-sdk-imagebuilder aws-sdk-iotsitewise aws-sdk-kafka aws-sdk-kinesisvideo aws-sdk-license-manager aws-sdk-macie2 aws-sdk-mediaconvert aws-sdk-medialive aws-sdk-mediastore aws-sdk-networkmanager aws-sdk-opensearchserverless aws-sdk-outposts aws-sdk-personalize-runtime aws-sdk-pinpoint-email aws-sdk-proton aws-sdk-qldb-session aws-sdk-quicksight aws-sdk-redshift-data-api aws-sdk-resiliencehub aws-sdk-route53-recovery-control-config aws-sdk-route53-recovery-readiness aws-sdk-securityhub aws-sdk-serverlessrepo aws-sdk-shield aws-sdk-signer aws-sdk-snowballexpress aws-sdk-softwarecatalog-product aws-sdk-sts aws-sdk-support aws-sdk-transfer-for-sftp aws-sdk-translate aws-sdk-waf-regional aws-sdk-workdocs aws-sdk-xray -t noetic-devel ``` 安装完成后重新打开终端窗口再次执行相同指令即可解决问题. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值