有没有办法在视图中找出当前控制器的内容?
举例说明为什么我想知道这个:如果几个控制器共享相同的布局,我可能在布局ERB文件中有一个部分,我想根据控制器突出显示当前页面的菜单项.
也许这是一个糟糕的方法.如果是这样,更优选的方法是什么?
不过,我很想知道如何获得当前控制器的名称.
(显然我可以@controller_name = 'users'
在每个控制器中放置类似的东西;但这似乎是Rails在幕后已经完成的事情.所以我只是想知道是否有内置方式.)
假设我从服务请求中获得了一些JSON,如下所示:
{
"message": "We're unable to complete your request at this time."
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么那个抄袭被编码为那个('
); 我所知道的是我想解码它.
这是一种使用jQuery的方法,它突然出现在我脑海中:
function decodeHtml(html) {
return $('<div>').html(html).text();
}
Run Code Online (Sandbox Code Playgroud)
但这似乎(非常)hacky.什么是更好的方式?有"正确"的方式吗?
这个问题几乎说明了一切.
例如,如果我使用Twitter Bootstrap,我可以在自己的SASS样式表中定义继承自Bootstrap的CSS类的类吗?或者SASS中的继承只能在单个文件的范围内工作?
我意识到,一般来说,使用反射会产生性能影响.(事实上,我自己并不是反思的粉丝;这是一个纯粹的学术问题.)
假设存在一些看起来像这样的类:
public class MyClass {
public string GetName() {
return "My Name";
}
}
Run Code Online (Sandbox Code Playgroud)
跟我来这儿.我知道如果我有一个MyClass
被叫的实例x
,我可以打电话x.GetName()
.此外,我可以设置一个Func<string>
变量x.GetName
.
现在这是我的问题.假设我不知道上面的类叫做MyClass
; 我有一些对象,x
但我不知道它是什么.我可以GetName
通过这样做来检查该对象是否有方法:
MethodInfo getName = x.GetType().GetMethod("GetName");
Run Code Online (Sandbox Code Playgroud)
假设getName
不为空.然后,我不能进一步检查getName.ReturnType == typeof(string)
和getName.GetParameters().Length == 0
,在这一点上,我岂不是很肯定的是,在我所代表的方法,getName
对象可以肯定被转换为一个Func<string>
,不知何故?
我意识到有一个MethodInfo.Invoke
,我也意识到我总能创造一个Func<string>
像:
Func<string> getNameFunc = () => getName.Invoke(x, null);
Run Code Online (Sandbox Code Playgroud)
我想我要问的是,是否有任何方法可以从一个MethodInfo
对象转到它所代表的实际方法,从而在该过程中产生反射的性能成本,但 …
这个问题可能会让我听起来很无能为力.那是因为我.
我只是想,如果我假设有兴趣设计我自己的文本编辑器GUI控件,小部件或任何你想要调用的东西(我不是),我怎么会这样做呢?
像我这样的新手的诱惑是以字符串的形式存储文本编辑器的内容,这看起来非常昂贵(并不是说我太熟悉字符串实现在一种语言/平台和下一种语言/平台之间的区别;但是我知道在.NET中,例如,它们是不可变的,所以频繁的操作,例如你需要在文本编辑器中支持的内容,将会非常浪费,在一个接一个地连续构建一个字符串实例).
据推测,使用包含文本的一些可变数据结构; 但弄清楚这个结构可能会是什么样的,这对我来说是一个挑战.随机访问会很好(我想,无论如何 - 毕竟,你不希望用户能够跳到文本的任何地方吗?),但后来我想知道导航到某个地方的成本在一个巨大的文件中间并立即开始输入.同样,新手方法(比如你将文本存储为可调整大小的字符数组)会导致性能非常差,我想,就像用户输入的每个字符一样,会有大量的数据要"移位"过度.
因此,如果我不得不猜测,我认为文本编辑器采用某种结构将文本分成更小的部分(行,可能?),它们各自包含随机访问的字符数组,并且它们本身是随机的可作为离散块访问.即使这看起来似乎必须是一个相当可怕的过度简化,但是,如果它甚至远远接近开始.
当然,我也认识到,有可能无法成为一个"标准"的方式,文本编辑器来实现; 也许它在一个编辑器之间变化很大.但我想,由于这显然是一个已被解决很多次的问题,这些年来可能已经出现了一种相对普遍的方法.
无论如何,我只是想知道是否有人对这个主题有一些了解.就像我说的那样,我绝对不想写自己的文本编辑器; 我只是好奇.
编辑:底部的评论.还有,这个.
这就是让我感到困惑的一点.我的理解是,如果我有这样的枚举......
enum Animal
{
Dog,
Cat
}
Run Code Online (Sandbox Code Playgroud)
...我基本上完成的是定义了一个用两个定义的值调用的值类型Animal
,Dog
和Cat
.这种类型派生自引用类型 System.Enum
(值类型通常不能执行的操作 - 至少不在C#中 - 但在这种情况下是允许的),并且具有用于在int
值之间来回转换的工具.
如果我刚刚描述上面的枚举类型的方式是真的,那么我希望以下代码抛出InvalidCastException
:
public class Program
{
public static void Main(string[] args)
{
// Box it.
object animal = Animal.Dog;
// Unbox it. How are these both successful?
int i = (int)animal;
Enum e = (Enum)animal;
// Prints "0".
Console.WriteLine(i);
// Prints "Dog".
Console.WriteLine(e);
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您不能将值类型System.Object
从其确切类型以外的任何其他方式取消装箱.那以上怎么可能呢?这是因为如果该 …
我相信这很容易; 我无法立即从谷歌找到答案.
我知道我能做到这一点(对吗?):
text = ""
File.open(path).each_line do |line|
text += line
end
# Do something with text
Run Code Online (Sandbox Code Playgroud)
但那似乎有点过分,不是吗?或者这是人们在Ruby中做到的方式?
浏览string.GetHashCode
使用Reflector的源代码会显示以下内容(对于mscorlib.dll版本4.0):
public override unsafe int GetHashCode()
{
fixed (char* str = ((char*) this))
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*) chPtr;
for (int i = this.Length; i > 0; i -= 4)
{
num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
if (i <= 2)
{
break;
}
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]; …
Run Code Online (Sandbox Code Playgroud) 众所周知,.NET中的字符串是不可变的.(好吧,不是100%完全不可变,但设计不可变,无论如何都被任何理性的人使用.)
这使得基本上可以,例如,以下代码只在两个变量中存储对同一字符串的引用:
string x = "shark";
string y = x.Substring(0);
// Proof:
fixed (char* c = y)
{
c[4] = 'p';
}
Console.WriteLine(x);
Console.WriteLine(y);
Run Code Online (Sandbox Code Playgroud)
以上输出:
sharp
sharp
Run Code Online (Sandbox Code Playgroud)
显然,x
并y
指向同一个string
对象.所以这是我的问题:为什么不Substring
总是与源字符串共享状态?字符串本质上是char*
一个长度的指针,对吗?所以在我看来,至少在理论上应该允许分配单个内存块来保存5个字符,其中两个变量只指向该(不可变)块内的不同位置:
string x = "shark";
string y = x.Substring(1);
// Does c[0] point to the same location as x[1]?
fixed (char* c = y)
{
c[0] = 'p';
}
// Apparently not...
Console.WriteLine(x);
Console.WriteLine(y); …
Run Code Online (Sandbox Code Playgroud) .net ×4
string ×4
immutability ×2
inheritance ×2
c# ×1
clr ×1
cocoapods ×1
controller ×1
css ×1
enums ×1
file ×1
func ×1
gethashcode ×1
git ×1
hashcode ×1
io ×1
javascript ×1
jquery ×1
methodinfo ×1
objective-c ×1
performance ×1
reflection ×1
ruby ×1
sass ×1
stylesheet ×1
substring ×1
text-editor ×1
unboxing ×1
view ×1