Object#is_a? 在Rails 3中以最奇怪的方式失败.我的单表继承设置如下(简化为简洁):
# resource.rb
class Resource < ActiveRecord::Base
# blah blah
end
# video.rb
class Video < Resource
# blah blah
end
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我有这个:
def create
@resource = Resource.find params[:resource_id]
logger.info '@resource class: ' + @resource.class.name
logger.info '@resource superclass: ' + @resource.class.superclass.name
logger.info '@resource is_a?(Video): ' + @resource.is_a?(Video).inspect
logger.info '@resource is_a?(Resource): ' + @resource.is_a?(Resource).inspect
logger.info '@resource is_a?(ActiveRecord::Base): ' + @resource.is_a (ActiveRecord::Base).inspect
# Do some other stuff
end
Run Code Online (Sandbox Code Playgroud)
调用该#create操作会生成以下日志结果:
@resource class: Video
@resource superclass: Resource
@resource is_a?(Video): true
@resource …Run Code Online (Sandbox Code Playgroud) 我attr_accessible按照这篇文章使用动态:
http://asciicasts.com/episodes/237-dynamic-attr-accessible
它工作正常.但我还没有找到一种优雅的方法来使它适用于嵌套属性.这是一些简化的代码:
class Company < ActiveRecord::Base
has_many :employees
accepts_nested_attributes_for :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
attr_protected :salary
attr_accessor :accessible
def mass_assignment_authorizer
if accessible == :all
ActiveModel::MassAssignmentSecurity::BlackList.new
else
super + (accessible || [])
end
end
end
Run Code Online (Sandbox Code Playgroud)
假设我有一个管理界面,其中包含一个公司的RESTful表单.在此表单上,我有字段employees_attributes,包括用于创建新Employees的空白字段.Employee#accessible=在这种情况下我无法找到一种方法.浏览ActiveRecord源代码,似乎这可能是不可能的:在非常深的调用堆栈的最远端,嵌套关联只会导致Employee.new使用属性调用.
我想过要创建一个可以通过批量分配传递的特殊属性.如果属性的值是正确的代码,则Employee实例将设置@accessible为:all.但我认为没有办法保证在受保护的属性之前设置此属性.
有没有办法让动态受保护的属性与嵌套属性一起使用?
在OS X 10.9.2上,我安装了GHC平台.(有一个事先安装,但我相信我通过删除/Library/Haskell和删除它/Users/username/Library/Haskell.)平台附带了Cabal 1.16.我想要最新的Cabal支持沙盒,所以我跑了:
cabal update
cabal install cabal --reinstall
Run Code Online (Sandbox Code Playgroud)
那很好.但后来我也尝试升级cabal-install:
cabal install cabal-install -v
Run Code Online (Sandbox Code Playgroud)
它失败了以下输出:
Reading available packages...
Choosing modular solver.
Resolving dependencies...
Ready to install cabal-install-1.20.0.0
Waiting for install task to finish...
Extracting
/Users/username/Library/Haskell/repo-cache/hackage.haskell.org/cabal-install/1.20.0.0/cabal-install-1.20.0.0.tar.gz
to
/var/folders/jt/ywln8_hn75q1yfkhnpcs1bzh0000gn/T/cabal-install-1.20.0.0-51744...
Updating cabal-install.cabal with the latest revision from the index.
Configuring cabal-install-1.20.0.0...
Flags chosen: old-directory=False
Dependency Cabal ==1.20.0.0: using Cabal-1.20.0.0
Dependency HTTP ==4000.2.8: using HTTP-4000.2.8
Dependency array ==0.4.0.1: using array-0.4.0.1
Dependency base ==4.6.0.1: using base-4.6.0.1
Dependency bytestring …Run Code Online (Sandbox Code Playgroud) 我想实现Deref,并DefrefMut在拥有盒装性状,例如一个结构:
use std::ops::{Deref, DerefMut};
trait Quack {
fn quack(&self);
}
struct QuackWrap {
value: Box<Quack>
}
impl Deref for QuackWrap {
type Target = Box<Quack>;
fn deref<'a>(&'a self) -> &'a Box<Quack> {
&self.value
}
}
impl DerefMut for QuackWrap {
fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack> {
&mut self.value
}
}
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
src/main.rs:14:5: 16:6 error: method `deref` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime [E0053]
src/main.rs:14 fn …Run Code Online (Sandbox Code Playgroud) PhantomDataCopy以令人惊讶的方式进行交互:
use std::marker::PhantomData;
#[derive(Copy, Clone)]
pub struct Seconds;
pub struct Meters;
#[derive(Copy, Clone)]
pub struct Val<T> {
pub v: PhantomData<T>
}
fn main() {
let v1: Val<Seconds> = Val {v: PhantomData};
let v2 = v1;
let v3 = v1;
let v4: Val<Meters> = Val {v: PhantomData};
let v5 = v4;
let v6 = v4;
}
Run Code Online (Sandbox Code Playgroud)
这失败如下:
src/main.rs:20:13: 20:15 error: use of moved value: `v4` [E0382]
src/main.rs:20 let v6 = v4;
^~
src/main.rs:19:13: 19:15 note: `v4` moved here because …Run Code Online (Sandbox Code Playgroud) 我们称之为亚伦的一位同事被指派翻新一个网站的一个部分作为一个长期项目.他创建了一个名为的新Git分支aaron.他所有的改变都是在这个分支上进行的.在他工作的同时,我继续维护整个网站,对我做出改变master.
最终,亚伦将他的分支合并到了master.这以某种方式还原了我master在合并时和aaron首次创建分支之间所做的所有提交.如果我打字git show <hash of merge commit>,我可以看到当Aaron在他的分支上工作时我改变的每个文件的差异.这些差异显示了我所做的每一项改变的回归.如果Aaron手动将其分支上的每个文件的内容复制到master并提交更改,它看起来就像是这样.(他没有这样做.我只是想说明日志显示的内容.)
根据亚伦的说法,他没有做任何奇怪的事情.他说他刚跑了git pull origin/aaron.
可能是什么导致了这个?是否有可能git pull origin aaron将我的所有更改都还原为master?
此外,是否有一种简单的方法可以将我的更改恢复到master而不还原他的所有工作?
编辑1:
其中一个已更改但在master合并后还原的文件是foo.txt.所以我这样做了:
git checkout aaron
git log foo.txt
Run Code Online (Sandbox Code Playgroud)
日志并不能反映任何变化foo.txt的时刻之后aaron分支产生.我有点期待在aaron分支的日志中看到我的更改的恢复,但我没有.那么,这最终证明亚伦做了一些其他事情而不是他声称做过的简单拉动吗?
编辑2:
我曾经说过他打字origin/aaron,但他确实打字了origin aaron.我已经改变了它.
编辑3
根据下面的建议,我选择通过重写历史来解决这个问题.我在这一点上确信这个问题是由一个误导的解决冲突的企图造成的.
假设我有很多人的数据,我希望能够以不同的方式查找它们.也许有某种数据结构(如二叉树)有助于按名称查找.也许还有另一个(如列表)按创作顺序排列.也许还有更多.
在许多语言中,您可以让每个人在堆上分配一次.每个数据结构都包含指向该内存的指针.因此,每次添加新的查找方式时,您都不会分配一组新人.
在哈斯克尔怎么样?当不同的数据结构需要索引相同的数据时,有没有办法避免内存重复?
假设我有以下内容:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data Book = Book {
_author :: String,
_title :: String
} deriving (Show)
makeLenses ''Book
data Location = Location {
_city :: String,
_state :: String
} deriving (Show)
makeLenses ''Location
data Library = Library {
_location :: Location,
_books :: [Book]
} deriving (Show)
makeLenses ''Library
lib :: Library
lib = Library (Location "Baltimore" "MD") [Book "Plato" "Republic", Book "Aristotle" "Ethics"]
Run Code Online (Sandbox Code Playgroud)
我试图通过组合镜头来了解通过多层向下延伸的各种方法.我知道如何做这些操作:
-- returns "Baltimore"
lib ^. location . city
-- …Run Code Online (Sandbox Code Playgroud) 为了使网站易于访问,我的政策到目前为止一直遵循WCAG - 不多也不少.我认为WCAG是彻底和完整的.因此,我假设如果我遵循其中的每一条建议,从可访问性的角度来看,我的网站将是无可指责的.在与一些残疾网络用户交谈后,我想知道是否应该重新考虑这项政策.
这些真实用户告诉我,根据他们的经验,以下技术对任何网站都是绝对必要的:
aria-live="polite".并非每个用户都引用了这些技术中的每一种.这只是所有用户提出的建议集的结合.还有其他令人惊讶的建议; 这些只是我记得的.
所有这些建议值得注意的是,据我所知,他们不是WCAG的建议.你对这种不和谐有什么看法?
一方面,我没有理由怀疑这些技术对我说话的用户很重要.他们没有理由不诚实,或夸大他们的需求.他们似乎对他们使用的辅助技术有了深刻的理解,所以我认为他们也不仅仅是误传.
另一方面,如果有些人需要这些技术,他们为什么不参加WCAG?WCAG是不完整的?或者这些需求是如此特殊,对于这些特定用户来说是如此独特,将它们包含在WCAG中并在每个站点上实现它们是不明智的吗?
是否可以依靠WCAG作为网络可访问性的正确和完整的清单?如果是这样,您是否对如何与用户的评论进行协调以及在请求此类技术时可能适当的响应有任何想法?
根据与Dryden Long的对话进行编辑
我应该澄清一点,我不认为WCAG 绝对完整,并为每个最后一个残疾用户提供解决方案.相反,我正在考虑网络开发人员是否可以合理地依赖WCAG来创建一个尽可能可访问的网站.而且,是否需要在WCAG之外寻找以实现该目标.
我必须选择一个带有16K元素的浮点序列的类型.这些值将经常更新,可能每秒更新一次.
我已经在数组上阅读了wiki页面.以下是我到目前为止得出的结论.(如果有任何错误,请纠正我.)
在这种情况下,IArrays会慢得令人无法接受,因为它们会在每次更改时被复制.阵列中有16K浮点数,每次复制64KB内存.
IOArrays可以做到这一点,因为它们可以在不复制所有数据的情况下进行修改.在我的特定用例中,在IO monad中进行所有更新根本不是问题.但它们是盒装的,这意味着额外的开销,这可能会增加16K元素.
IOUArrays看起来非常合适.与IOArrays一样,它们不需要在每次更改时都有完整的副本.但与IOArrays不同,它们是未装箱的,这意味着它们基本上是Haskell等效的C系列浮点数.我意识到他们很严格.但我不认为这是一个问题,因为我的应用程序永远不需要访问任何少于整个数组的东西.
我是否正确地期待IOUArrays?
另外,假设我后来想要从多个线程读取或写入数组.我会用IOUArrays支持自己吗?或者IOUArrays的选择与并发问题完全正交?(我还不熟悉Haskell中的并发原语以及它们如何与IO monad交互.)