要向Hash添加新对,我会:
{:a => 1, :b => 2}.merge!({:c => 3}) #=> {:a => 1, :b => 2, :c => 3}
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法从哈希删除密钥?
这有效:
{:a => 1, :b => 2}.reject! { |k| k == :a } #=> {:b => 2}
Run Code Online (Sandbox Code Playgroud)
但我希望有类似的东西:
{:a => 1, :b => 2}.delete!(:a) #=> {:b => 2}
Run Code Online (Sandbox Code Playgroud)
重要的是返回值将是剩余的哈希值,因此我可以执行以下操作:
foo(my_hash.reject! { |k| k == my_key })
Run Code Online (Sandbox Code Playgroud)
在一条线上.
编辑:感谢您的回复,我尝试了下面列出的所有内容,但现在仍然很幸运。如果我输入 localhosts/posts/new 它会将我带到表单,但是当我从导航栏中单击时链接不起作用。我已经更新了代码并包含了我的 rake 路线结果。
我是 ruby 新手,正在学习教程,但是我的一个链接不起作用,不确定发生了什么。
我创建新帖子的导航链接没有将我带到正确的页面,当我单击“posts_path”的链接时,页面不会改变。
我可以通过在地址栏中键入 /posts/new 来创建新帖子,但是当我单击导航栏上的“新帖子”链接时,页面不会更新(尽管 url 显示 /posts)。知道如何解决这个问题吗?
配置/路由.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
get '/search', to: 'static_pages#search'
get '/login', to: 'sessions#new'
get '/posts', to: 'posts#new', as: 'new_post'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/signup', to: 'users#new'
get 'users/new'
get 'static_pages/home'
get 'posts/new'
get 'sessions/new'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :posts, only: [:new, :create, :destroy]
end
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/布局/_header.html.erb
<header class="navbar …Run Code Online (Sandbox Code Playgroud) 如果我有这样的对象数组:
var mountains = [
{ name: 'Kebnekaise', elevation: 2106 },
{ name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' }
];
Run Code Online (Sandbox Code Playgroud)
如何获得所有独特的钥匙即['name', 'elevation', 'comment']?
我不认为这需要新的,萌芽的Rubyist很长时间才会陷入尝试使用新数组作为默认值创建哈希的陷阱,Hash.new([])但却发现该方法没有按预期运行.(如果您不确定我在说什么,请参阅此Stack Overflow问题和所选答案.)
有谁知道这是否是一个历史或其他原因,这是默认行为?因为我从未遇到过我想要这种行为的情况.而且,即使考虑到Rubyist想要这种行为的假设理由也不是一件容易的事.
我理解这种方式更加一致,因为它以相同的方式处理可变和不可变的默认值,但是对于可变和不可变的默认值具有不同的默认行为似乎并不那么糟糕.